Ошибка JNI NoClassDefFoundError в исполняемом файле springboot

#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 зависимостей, который также используется другими классами. Если мы добавим их снова, вызовет ли это какие-либо конфликты?