Контекст: Чтобы создать несколько исполняемых файлов 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 tvf для файла jar, но в нем указано слишком много файлов, и невозможно прокрутить до начала в терминале, также предполагаю, что это связано с объемом отображаемых записей
на всякий случай: вы пытались переместить класс pkg1.pkgCalculator.Calculator в calculator.Calculator (удалить pkg1 первого уровня)? и попробуйте извлечь содержимое jar, чтобы проверить МАНИФЕСТ, вероятно, там неверное значение атрибута Main-Class ...
Пытался, даже если это не работает. Есть ли способ приостановить прокрутку экрана, когда мы выполняем jar tvf, например, просмотр страницы или что-то в этом роде? Потому что, если я выполняю только этот экран, прокручивается слишком быстро и не вижу все, что отображается. Проверено - docs.oracle.com/javase/8/docs/technotes/tools/windows/jar.ht ml, но не нашел
вам необходимо извлечь банку, чтобы проверить содержимое МАНИФЕСТА: jar xf YOUR_JAR
Манифест выглядит нормально, содержит версию (манифест и реализацию), а также заголовок и основной класс. По крайней мере, мне кажется, что в этом нет ничего плохого.
Позвольте нам продолжить обсуждение в чате.




После обсуждения с @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 ... есть ли способ включить остальные мои зависимости внутри этой дополнительной банки?
вы должны проверить содержимое созданного jar и убедиться, что все необходимые скомпилированные классы включены (в правильный пакет), а МАНИФЕСТ присутствует с правильным атрибутом Main-Class