Сервлет выдает ошибку java.lang.NoClassDefFoundError

Я использую следующий код в сервлете моего приложения

java.awt.Image awtImg = java.awt.Toolkit.getDefaultToolkit().createImage(str1);

Когда я запускаю приложение и вызываю сервлет, я получаю следующую ошибку

java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11.XToolkit
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:169)
java.awt.Toolkit$2.run(Toolkit.java:834)
java.security.AccessController.doPrivileged(Native Method)
java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826)
noticeandreports.pdf.appendFiles.PdfFunctionsClass.addSealSpace(PdfFunctionsClass.java:198)
OJ.NoticesandReports.generate_151_OJNotice.execute(generate_151_OJNotice.java:768)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Я разместил приложение на компьютере с Linux с версией Java JDK 1.6.20..

Что может быть причиной проблемы...

noticeandreports.pdf.appendFiles.PdfFunctionsClass — это класс, в котором написан код, а OJ.NoticesandReports.generate_151_OJNotice — это сервлет, который вызывает метод внутри вышеуказанного класса...


person Sangeet Menon    schedule 07.04.2011    source источник
comment
Какой JDK вы используете? По моему опыту, большинство дистрибутивов Linux не предоставляют Sun/Oracle JDK по умолчанию, и другие JDK могут отсутствовать в этом файле (он должен находиться в rt.jar, который должен быть в вашем пути к классам).   -  person Thomas    schedule 07.04.2011
comment
Я использую SUN JDK. Я работаю в Linux Redhat. Я установил в него SUN JDK 1.6.20... и у меня есть rt.jar в моем java, установленном в месте /opt/jdk1.6.20/jre/lib   -  person Sangeet Menon    schedule 07.04.2011


Ответы (2)


Чтобы использовать классы AWT в серверном приложении, я считаю, что вам нужно запустить в " безголовый" режим. Измените запуск вашего контейнера сервлета, чтобы включить:

-Djava.awt.headless=true

(Или установите системное свойство в своем собственном коде, если вам действительно нужно.)

Вы также можете рассмотреть возможность использования альтернативной библиотеки изображений — сторонней или пакета javax.imageio.

person Jon Skeet    schedule 07.04.2011
comment
Он работал нормально без каких-либо ошибок или исключений в течение нескольких дней, почему он вдруг начал выдавать ошибку ?? - person Sangeet Menon; 07.04.2011
comment
S.M.09: Точно такой же код и никаких изменений конфигурации? Без понятия. Было бы полезно, если бы вы сказали это для начала. - person Jon Skeet; 07.04.2011
comment
@Jon Skeet: точно такой же код и никаких изменений в конфигурации? да... вообще никаких изменений... работало нормально несколько дней... вдруг сегодня утром я стал получать звонки отовсюду!! Может это какая-то коррупция?? Потому что при изменении безголового режима ошибка исчезла... - person Sangeet Menon; 07.04.2011
comment
@Jon Skeet: Нет подключения к Интернету, на нем размещены приложения только для локальной сети ... (только для пользователей внутри здания).. Так что автоматическое обновление исключено ... - person Sangeet Menon; 07.04.2011
comment
@ S.M.09: Ладно, тогда это просто странно. Есть ли шанс, что кто-то был вошел в систему через X-сервер, который он использовал, и теперь он вышел из системы, не давая ему возможности выполнять операции? - person Jon Skeet; 07.04.2011
comment
@Jon Skeet: Не уверен в этом ... возможно, мне нужно посмотреть журналы и все более внимательно ... может быть, что-то всплывет ... пока все работает нормально ... есть ли способ навсегда изменить режим безголового, вместо запуска каждый раз при запуске - person Sangeet Menon; 07.04.2011

Это почти наверняка не полная трассировка стека. Либо эта трассировка стека, либо более ранняя в файле журнала расскажет вам, что вызвало сбой инициализации sun.awt.X11.XToolkit.

Однако я рискну предположить, что основная причина заключается в том, что JVM, на котором работает веб-счетчик, «безголовый»; то есть у него нет доступного дисплея.

Техническая статья Oracle Java, озаглавленная "Использование автономного режима на платформе Java SE" (Артем Ананьев и Алла Редько, июнь 2006 г.) описывает проблему и что с ней делать.

Решение, вероятно, такое же простое, как добавление -Djava.awt.headless=true к параметрам JVM в сценарии запуска веб-контейнера. Например, если вы используете Tomcat, добавьте это в переменную окружения $JAVA_OPTS перед вызовом catalina.sh.

person Stephen C    schedule 07.04.2011
comment
Ссылка на техническую статью Sun отсутствует - person rajadilipkolli; 05.10.2016
comment
@rajadilipkolli - Вы можете найти недостающую статью? - person Stephen C; 05.10.2016
comment
Я много пробовал и не мог найти, поэтому пингую, если вы можете мне помочь - person rajadilipkolli; 08.10.2016
comment
Вы, очевидно, не особо искали... потому что я нашел его за 2 минуты. Фиксированный. - person Stephen C; 08.10.2016