ClassNotFoundException при попытке ссылаться на классы в jar-файлах в подкаталоге внутри исполняемого jar-файла.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ClassNotFoundException при попытке ссылаться на классы в jar-файлах в подкаталоге внутри исполняемого jar-файла.

Сообщение Anonymous »

Проекты
У меня есть 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, созданного для проекта
Импорт извлекает зависимость Core из сценария сборки, используя:

Код: Выделить всё

dependencies {

implementation group: 'com.company.core', name: 'core', version: '0.1.0-SNAPSHOT', classifier: 'api'
Это определение задачи jar для импорта:

Код: Выделить всё

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
Я получаю исключения NoClassDefFoundError:

Код: Выделить всё

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
Похоже, что исполняемый файл не может найти файлы .class внутри сторонних jar-файлов, которые находятся внутри каталога lib/ import.jar.
Разве JVM не сможет загружать файлы .class из файлов .jar внутри моего исполняемого jar-файла?
Учитывая, что я обновил флаг пути к классам, включив в него -cp "import.jar:lib/*"? это не относится к внутренней части банки?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ub-directo
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»