Не удалось устранить ошибку: java.lang.NoClassDefFoundError: org / json / simple / parser / ParseException - PullRequest
0 голосов
/ 15 января 2019

Попытка использовать Maven для организации моего проекта, и я продолжаю сталкиваться со следующей ошибкой. Я знаю, что эта ошибка означает, что файл присутствует во время компиляции, но по какой-то причине его нельзя найти во время выполнения.

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException

Итак, я работаю над проектом на Java, который будет принимать пользовательский запрос, искать в Google Images и затем загружать некоторые результаты на мой компьютер. Для этого мне пришлось использовать сторонние библиотеки, такие как JSoup, Json-Simple и Gson.

Сначала я вручную добавил Jsoup в свой путь к классам, и это сработало, но потом я услышал о Maven и начал использовать его вместо этого. Моя проблема в том, что когда я пытаюсь запустить свой код, я получаю сообщение об ошибке выше.

Я просто не уверен, как решить эту проблему. Я видел множество других сообщений о подобных ошибках, и я попытался изменить свой pom.xml соответственно, но Я просто не могу заставить его работать. Я попытался удалить файл ~ / .m2, запустил mvn clean, установил mvn, пакет mvn, скомпилировал mvn, и все работает нормально. Но когда приходит время бежать, я получаю эту ошибку.

Вот большая часть моего файла pom.xml.

<repositories>
    <repository>
    <id>central</id>
   <name>Maven repository</name>
   <url>http://repo1.maven.org/maven2</url>
 </repository>

<dependencies>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
</dependency>

<dependency>
  <!-- jsoup HTML parser library @ https://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.11.3</version>
  <scope>provided</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

<build>
<plugins>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <mainClass>fully.qualified.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>
</plugins>
</build>

НАЙДЕННОЕ РЕШЕНИЕ: Поэтому я упустил некоторые части файла pom.xml, чтобы его было легче читать, и поскольку все остальные части были сгенерированы самим Maven, я решил, что с этим ничего не может быть. Но он добавляет тег «pluginManagement», который включает в себя все остальные плагины, и, очевидно, это не позволяет плагину Shade работать.

Между руководством ngueno и этим постом Плагин оттенка Maven не вызывается автоматически для цели "пакет" Мне удалось выяснить мою проблему, хотя я все еще не совсем уверен, почему это проблема. В любом случае, я решил обновить этот пост на случай, если кто-то с подобной проблемой наткнется на него. Это было на Mac OS между прочим, на случай, если что-то изменится. Спасибо за вашу помощь всем.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Обычно NoClassDefFound ошибки связаны с отсутствующими библиотеками во время выполнения.

Поскольку вы работаете с терминалом, я полагаю, вы создаете свой проект с использованием Maven и запускаете сгенерированный JAR,

Я бы порекомендовал вам использовать maven-shade-plugin и сгенерировать uber-jar , как я объяснил в этом вопросе .

Целью создания uber-jar является перенос всех необходимых зависимостей внутри него (доступно в пути к классам приложения).

Реализуйте плагин и попробуйте запустить его, используя новый JAR.

PS: Не забудьте проверить этот раздел , относящийся к Исполняемые банки

ОБНОВЛЕНИЕ: Удалите <scope>provided</scope> вашей зависимости jsoup, чтобы заставить Maven упаковывать ее вместе с вашим приложением, с предоставленной областью действия, о которой вы говорите, что эта зависимость будет предоставлена ​​JDK по адресу во время выполнения.

0 голосов
/ 15 января 2019

Банки, которые вы определили в своих зависимостях, должны присутствовать в пути к классам среды выполнения. Это не путь к классам, который доступен при компиляции кода; это путь к классу на хосте, на котором вы запускаете приложение.

Вы должны установить эти файлы jar на целевом хосте.

Редактировать: Подробнее

Вы должны сделать следующее:

  1. Определение хоста времени выполнения.
  2. Создайте каталог на хосте времени выполнения, в который вы будете устанавливать зависимые файлы JAR.
  3. Включить каждую банку в путь к классу.

Подумайте о том, чтобы отказаться от пути "брось на себя" Если вы используете Spring Boot (Мне это нравится, Я не работаю на них). Одной из особенностей весенней загрузки является переизобретенный «Fat Jar», который будет включать зависимости внутри одного доставляемого артефакта (толстый кувшин) и добавлять их в путь к классам при запуске.

0 голосов
/ 15 января 2019

Скиппи попробует дать netbeans шанс увидеть ту же ошибку, возможно, если она выдаст ту же ошибку, мы можем начать внутреннюю работу над тем, что именно не так с вашей программой, и, надеюсь, решить проблему:)

Вот ссылка, которая может помочь вам в решении вашей проблемы: https://crunchify.com/how-to-fix-java-lang-classnotfoundexception-org-springframework-web-servlet-dispatcherservlet-exception-spring-mvc-tomcat-and-404-error/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...