Как я могу решить ошибку JNI: java.lang.NoClassDefFoundError: при запуске java-программы с docker openjdk: 8?

Как я могу решить ошибку JNI: java.lang.NoClassDefFoundError: twitter4j / TwitterException при запуске Java-программы с docker openjdk: 8

Мой Dockerfile:

FROM openjdk:8
ADD dist/TwitterData.jar TwitterData.jar  
ENV CLASSPATH .:.twitter4j.jar
ENTRYPOINT ["java","-jar","TwitterData.jar"]

Показана ошибка:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: twitter4j/TwitterException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: twitter4j.TwitterException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    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)

Вы скопировали основной двоичный файл, но скопировали ли вы зависимость twitter4j?

Matt Clark 08.05.2018 01:30

Когда я построил проект, чтобы получить банку, я добавил зависимость и построил банку. Следует ли мне использовать команду копирования в файле докеров?

Mateo Hervas 08.05.2018 01:38

Из-за ошибки NoClassDef может показаться, что twitter4j не был скопирован в ваш экспорт. Как вы собрали TwitterData.jar? Либо попробуйте вмешаться в сборку и убедиться, что зависимости действительно экспортированы, либо, да, явно скопируйте свои зависимости.

Matt Clark 08.05.2018 01:41

Я использовал IDE (Netbeans) для его создания. Я добавил зависимости из параметров свойств проекта, а затем обязательно щелкнул параметр сжатия файла jar. Я добавил COPY dist/lib/twitter4j-core-4.0.4.jar twitter4j-core-4.0.4.jar в файл докеров, но получил ту же ошибку.

Mateo Hervas 08.05.2018 01:45

При копировании явно убедитесь, что CLASSPATH также правильный. В этом случае он должен ссылаться на файл по полному имени, как twitter4j.jar! = twitter4j-core-4.0.4.jar

Matt Clark 08.05.2018 01:46

Я уже изменил файл докеров с правильными именами: FROM openjdk:8 ADD dist/TwitterData.jar TwitterData.jar COPY dist/lib/twitter4j-core-4.0.4.jar twitter4j-core-4.0.4.jar ENV CLASSPATH .:.dist/lib/twitter4j-core-4.0.4.jar ENTRYPOINT ["java","-jar","TwitterData.jar"], но я все еще получаю ту же ошибку: java.lang.NoClassDefFoundError: twitter4j / TwitterException

Mateo Hervas 08.05.2018 01:49

Команда Dockerfile COPY представляет собой форму COPY <src> <dst>, поэтому здесь ваш путь к классам не должен включать dist/lib, поскольку вы копируете непосредственно в корень проекта.

Matt Clark 08.05.2018 01:52

Вы также можете попробовать удалить строку ENV CLASSPATH и добавить путь к классам непосредственно в команде запуска java. ENTRYPOINT ["java", "-cp", "/path/to/twitter4j.jar", "-jar", "TwitterData.jar"]

Matt Clark 08.05.2018 01:53

Большое спасибо. Я еще раз исправил файл докеров и изменил команду копирования. Когда я создаю докер, я не получаю никаких ошибок, но когда я пытаюсь его запустить, я получаю ошибку NoClassDefFoundError: twitter4j / TwitterException

Mateo Hervas 08.05.2018 01:57

Я также удалил строку ENV CLASSPATH и добавил ее прямо из точки входа, но она все еще не работает. Есть идеи, почему это могло происходить?

Mateo Hervas 08.05.2018 02:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
10
1 982
1

Ответы 1

Чтобы решить эту ошибку, я вошел в оболочку изображения и вручную добавил переменные PATH, после этого все работает нормально.

Другие вопросы по теме