Gradle - несколько Jar из одного проекта

Контекст: Чтобы создать несколько исполняемых файлов jar из одного проекта - проект с несколькими пакетами gradle

Проблема: Я имею в виду решение, представленное в Ссылка, это помогает в создании баночки в папке build-> libs, но когда я пытаюсь запустить банку, ничего не происходит

Примечание: Даже если я сделаю имя пакета таким же, как имя файла java, сгенерированный jar не будет выполняться.

Также я заметил, что размер файла всех сгенерированных jar-файлов одинаков. Надеюсь, что проблема ясна, и ждите сообщений о том, где я делаю ошибку.

Моя структура проекта (иллюстративная цель):

ProjectA
-src
--main
---java
----pkg1
-----pkgCalculator         
------Calculator.java
-----pkgScale              
------Scale.java
----pkg2
-----pkgMusicPlayer        
------MusicPlayer.java
-----pkgVideoPlayer        
------VideoPlayer.java
---resources
----fxml
----css
--test
---java
---resources

Файл Gradle (соответствующая часть ниже, остальные по ссылке выше):

artifacts {
    archives jarPackage("pkgCalculator", "1.0"),
            jarPackage("pkgScale","1.0"),
            jarPackage("pkgMusicPlayer","1.0"),
            jarPackage("pkgVideoPlayer","1.0")

}

вы должны проверить содержимое созданного jar и убедиться, что все необходимые скомпилированные классы включены (в правильный пакет), а МАНИФЕСТ присутствует с правильным атрибутом Main-Class

M.Ricciuti 16.10.2018 18:04

Пробовал с помощью команды jar tvf для файла jar, но в нем указано слишком много файлов, и невозможно прокрутить до начала в терминале, также предполагаю, что это связано с объемом отображаемых записей

iCoder 16.10.2018 18:36

на всякий случай: вы пытались переместить класс pkg1.pkgCalculator.Calculator в calculator.Calculator (удалить pkg1 первого уровня)? и попробуйте извлечь содержимое jar, чтобы проверить МАНИФЕСТ, вероятно, там неверное значение атрибута Main-Class ...

M.Ricciuti 16.10.2018 18:46

Пытался, даже если это не работает. Есть ли способ приостановить прокрутку экрана, когда мы выполняем jar tvf, например, просмотр страницы или что-то в этом роде? Потому что, если я выполняю только этот экран, прокручивается слишком быстро и не вижу все, что отображается. Проверено - docs.oracle.com/javase/8/docs/technotes/tools/windows/jar.ht ml, но не нашел

iCoder 16.10.2018 19:04

вам необходимо извлечь банку, чтобы проверить содержимое МАНИФЕСТА: jar xf YOUR_JAR

M.Ricciuti 16.10.2018 19:10

Манифест выглядит нормально, содержит версию (манифест и реализацию), а также заголовок и основной класс. По крайней мере, мне кажется, что в этом нет ничего плохого.

iCoder 16.10.2018 19:34

Позвольте нам продолжить обсуждение в чате.

M.Ricciuti 16.10.2018 19:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
683
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После обсуждения с @iCoder первая часть проблемы была решена: функцию jarPackage нельзя было повторно использовать «как есть», и ее пришлось адаптировать для поддержки общей компоновки классов / пакетов:

def jarPackage(String jarName, String className, artifactVersion) {
    if (artifactVersion == "" || artifactVersion == null) {
        artifactVersion = "1.0.0"
    }
    return tasks.create("jar${jarName}", Jar) {
        baseName = jarName

        version = artifactVersion

        def String pkgName = className.substring(0, className.lastIndexOf("."))
        def String pkgDir = pkgName.replaceAll("\\.", "/")
        def String clazzName = className.substring( className.lastIndexOf(".") +1 )
        from(sourceSets.main.output) {
            include "$pkgDir//**"
        }

        from {
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }

        manifest {
            attributes "Implementation-Title": "$clazzName",
                    "Implementation-Version": "$version",
                    "Main-Class": "$pkgName.$clazzName"
        }
    }
}

artifacts {
    archives jarPackage("calculator", "pkg1.pkcalculator.Calculator" , "1.0.0")
}

Остается еще одна проблема, не связанная с Gradle, а с проблемой связывания JDK 11: @iCoder вы должны открыть другой вопрос для этой остающейся проблемы, если она еще не решена.

после запуска функции jarPackage в сборке я получаю нужные мне подмодули в дополнительной банке в сборке, но не получаю остальные его зависимости, такие как зависимости Springboot ... есть ли способ включить остальные мои зависимости внутри этой дополнительной банки?

USS-Montana 16.11.2018 12:42

Другие вопросы по теме