#java #spring-boot #maven #java-native-interface #noclassdeffounderror
#java #весенняя загрузка #maven #java-native-интерфейс #ошибка noclassdeffounderror
Вопрос:
У меня есть приложение springboot, которое подключается к общей динамической библиотеке клиента с помощью jni.
Существует один ** метод обратного вызова **, который регистрируется в dll с помощью функции ine register. Этот метод вызывается при некоторых событиях из dll.
При выполнении как java-приложение из intellij это работает нормально, но при выполнении ** как jar ** и при вызове этого метода обратного вызова он выдает ** NoClassDefFoundError **, как показано ниже
java.lang.NoClassDefFoundError: com/test/Sample
Caused by: java.lang.ClassNotFoundException: com.test.Sample
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java: 424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
По умолчанию springboot помещает все классы в папку BOOT-INF.
Когда я вручную изменил jar и добавил этот класс за пределы BOOT-INF, то есть на корневом уровне, это сработало. Как показано ниже:
BOOT-INF
com
META-INF
org
В приведенном выше фрагменте com — это каталог, внутри которого образец класса присутствовал при тестировании подпакета.
используемая версия springboot: 2.3.6.RELEASE
Использование springboot-maven-plugin для создания исполняемого jar
Комментарии:
1. Помогает ли это? Добавление классов в путь к классам файла JAR
2. Abra: Может быть, это может помочь, но как мы можем это сделать? Вы имеете в виду, что при выполнении jar через командную строку эти классы находятся внутри одного из jar зависимостей, который также используется другими классами. Если мы добавим их снова, вызовет ли это какие-либо конфликты?