У меня есть 2 проекта Java на основе Gradle, оба из которых упаковываются в файлы .jar:
- Ядро
- Java-библиотека
- Создает .jar, содержащий файлы .class проектов и файл lib/ внутри .jar, содержащий все файлы .jar сторонних зависимостей проекта.
- Содержит следующее в сценарии сборки для .jar, созданного для проекта.
Код: Выделить всё
tasks.getByName("jar") {
enabled = true
archiveClassifier.value("api")
from(sourceSets.main.get().output)
into("lib") {
from(configurations.runtimeClasspath)
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
- Импорт
- Будет выполнен по команде line
- Создает .jar, содержащий файлы .class проекта, а внутри lib/ находится сторонняя зависимость проекта .jar файлы (те же, что и те, что упакованы внутри core.jar://lib/*.jar), т.е. import.jar://lib/*.jar
- Содержит следующее в сценарии сборки для .jar, созданного для проекта
Код: Выделить всё
dependencies {
implementation group: 'com.company.core', name: 'core', version: '0.1.0-SNAPSHOT', classifier: 'api'
Код: Выделить всё
jar {
zip64 = true
manifest {
attributes 'Main-Class': 'com.import.Runner'
}
from {
duplicatesStrategy(DuplicatesStrategy.INCLUDE)
configurations.runtimeClasspath.collect {
if (it.isDirectory()) {
println "Directory: $it" // Never printed
it
} else {
println "Zip Tree: $it" // Printed, contains paths to jars from my maven directory on my file system
zipTree(it)
}
}
}
exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
}
Когда я выполняю jar импорта, используя это:
Код: Выделить всё
java -cp import.jar com.import.Runner
// Also tried:
java -cp "import.jar:lib/*" com.import.Runner
Код: Выделить всё
Exception in thread "main" java.lang.NoClassDefFoundError: com/company/exception/ApplicationException
at com.import.ImportClient.(ImportClient.java:24)
Caused by: java.lang.ClassNotFoundException: com.company.exception.ApplicationException
Разве JVM не сможет загружать файлы .class из файлов .jar внутри моего исполняемого jar-файла?
Учитывая, что я обновил флаг пути к классам, включив в него -cp "import.jar:lib/*"? это не относится к внутренней части банки?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ub-directo