КлассNotFoundException / NoClassDefFoundError в моем веб-приложении Java

Я разработчик веб-приложения с использованием Java. Когда я развертываю его на своем сервере приложений (Jetty, Tomcat, JBoss, GlassFish и т. Д.), Выдается ошибка. Я вижу это сообщение об ошибке в стеке:

java.lang.ClassNotFoundException 

Или

 java.lang.NoClassDefFoundError 

Что это значит и как я могу это исправить?

Что это значит?

Сначала давайте посмотрим на значение java.lang.ClassNotFoundException :

Брошено, когда приложение пытается загрузить в class через его имя строки, используя:

  • Метод forName в classе Class .
  • Метод findSystemClass в classе ClassLoader .
  • Метод loadClass в classе ClassLoader .

но определение classа с указанным именем не найдено.

Обычно это происходит при попытке открыть соединение вручную в этой форме:

 String jdbcDriver = "...'; //name of your driver Class.forName(jdbcDriver); 

Или когда вы ссылаетесь на class, принадлежащий внешней библиотеке, и, как ни странно, этот class не может быть загружен, когда сервер приложений пытается развернуть приложение.

Давайте посмотрим на значение java.lang.NoClassDefFoundError (выделение мое):

Брошено, если Java Virtual Machine или экземпляр ClassLoader пытается загрузить определение classа (как часть обычного вызова метода или как часть создания нового экземпляра с использованием нового выражения), и определение classа не может быть найдено.

Определение classа поиска было выполнено, когда исполняемый class был скомпилирован, но определение больше не может быть найдено .

В последней части говорится все: class существовал во время компиляции, т. Е. Когда я скомпилировал приложение через мою IDE, но он недоступен во время выполнения, т.е. когда приложение развернуто.


как я могу это исправить?

В веб-приложениях Java все сторонние библиотеки, используемые вашим приложением, должны находиться в папке WEB-INF / lib. Убедитесь, что все необходимые библиотеки (банки) размещены там. Вы можете проверить это легко:

 -  - WEB-INF - lib + jar1 + jar2 + ... - META-INF -  

Обычно эта проблема возникает для JDBC-подключений (MySQL, Derby, MSSQL, Oracle и т. Д.) Или веб-фреймворков MVC, таких как JSF или Spring MVC.

Учтите, что некоторые сторонние библиотеки полагаются на другие сторонние библиотеки, поэтому вам нужно добавить все их в WEB-INF / lib, чтобы приложение работало. Хорошим примером этого являются библиотеки RichFaces 4, в которых вы должны загружать и добавлять внешние библиотеки вручную .


Примечание для пользователей Maven : вы не должны испытывать эти проблемы, если только вы не установили библиотеки, как provided , не test или не установили system . Если задано значение, вы несете ответственность за добавление библиотек где-нибудь в пути к classам. Вы можете найти более подробную информацию об областях зависимости здесь: Введение в Механизм зависимостей


Если библиотека должна быть разделена между несколькими приложениями, которые будут развернуты на вашем сервере приложений, например, соединителем MySQL для двух приложений, есть еще одна альтернатива. Вместо того, чтобы развернуть два военных файла, каждый со своей собственной библиотекой соединителей MySQL, поместите эту библиотеку в общую папку библиотеки серверного приложения, это позволит библиотеке находиться в пути к classам всех развернутых приложений.

Эта папка отличается от сервера приложений.

  • Tomcat 7/8: / lib
  • JBoss 7 / Wildfly: / автономный / lib

Класс должен существовать под WEB-INF / classами или находиться внутри файла .jar в разделе WEB-INF / lib. Убедитесь, что это так.

Такая же проблема случится со мной.

Возможно, одна из ваших библиотек использует некоторые внутренние classы, которые недоступны

в вашей lib или maven зависимости pom.xml.

Это означает, что вы анализируете свои журналы ошибок и идентифицируете эти classы, а затем импортируете все зависимости в папке maven или lib.

Я исправил эту ошибку тем же способом.

потому что некоторые из моих библиотек используют internal.jar и json.jar внутренне.

Давайте будем гением компьютера.