Как я могу решить ошибку 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)
Когда я построил проект, чтобы получить банку, я добавил зависимость и построил банку. Следует ли мне использовать команду копирования в файле докеров?
Из-за ошибки NoClassDef может показаться, что twitter4j не был скопирован в ваш экспорт. Как вы собрали TwitterData.jar? Либо попробуйте вмешаться в сборку и убедиться, что зависимости действительно экспортированы, либо, да, явно скопируйте свои зависимости.
Я использовал IDE (Netbeans) для его создания. Я добавил зависимости из параметров свойств проекта, а затем обязательно щелкнул параметр сжатия файла jar. Я добавил COPY dist/lib/twitter4j-core-4.0.4.jar twitter4j-core-4.0.4.jar в файл докеров, но получил ту же ошибку.
При копировании явно убедитесь, что CLASSPATH также правильный. В этом случае он должен ссылаться на файл по полному имени, как twitter4j.jar! = twitter4j-core-4.0.4.jar
Я уже изменил файл докеров с правильными именами: 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
Команда Dockerfile COPY представляет собой форму COPY <src> <dst>, поэтому здесь ваш путь к классам не должен включать dist/lib, поскольку вы копируете непосредственно в корень проекта.
Вы также можете попробовать удалить строку ENV CLASSPATH и добавить путь к классам непосредственно в команде запуска java. ENTRYPOINT ["java", "-cp", "/path/to/twitter4j.jar", "-jar", "TwitterData.jar"]
Большое спасибо. Я еще раз исправил файл докеров и изменил команду копирования. Когда я создаю докер, я не получаю никаких ошибок, но когда я пытаюсь его запустить, я получаю ошибку NoClassDefFoundError: twitter4j / TwitterException
Я также удалил строку ENV CLASSPATH и добавил ее прямо из точки входа, но она все еще не работает. Есть идеи, почему это могло происходить?




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