NoClassDefFoundError при доступе к GraphicsEnvironment.getLocalGraphicsEnvironment в Tomcat - PullRequest
6 голосов
/ 04 июня 2009

У меня есть приложение, которое работает на tomcat, одним из способов является создание простого эскиза из изображения в формате JPEG. Функции отлично работают в автономном режиме и неделю назад также на tomcat. Но теперь я получаю следующую ошибку:

java.lang.NoClassDefFoundError
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:164)
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1141)
eval.impl.ImageEval.getThumbnail(ImageEval.java:155)
eval.impl.ImageServlet.doGet(ImageServlet.java:79)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Я не думаю, что я что-то изменил, что должно на это повлиять (на самом деле я вообще не менял функцию в соответствии с хранилищем svn), так что это должно быть проблемой библиотеки. Но я не могу понять, чего не хватает. Вот фактические строки из функции getThumbnail, где происходит ошибка:

        BufferedImage thumbImage = new BufferedImage(thumbWidth, 
            thumbHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics2D = thumbImage.createGraphics();
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    graphics2D.drawImage(simage, 0, 0, thumbWidth, thumbHeight, null);

[править] Я решил немного обновить описание проблемы. Да, похоже, что он не может найти какой-то класс из java.awt или тот, связанный с этим. Но они существуют на сервере в jvm. Безголовый режим Java не решает проблему. В другом проекте точно такой же код, но внутри веб-службы axis2 на этом сервере работает нормально. [/ Править]

Ответы [ 7 ]

7 голосов
/ 04 июня 2009

Похоже, вы изменили конфигурацию Tomcat.

Либо вы перешли на блок l {0,1} [iu] n [iu] x, либо установлены на виртуальной машине с управлением безопасностью, отличным от того, на котором вы ее тестировали.

Видимо

 GraphicsEnvironment.getLocalGraphicsEnvironment()

Пытается получить доступ к свойству: java.awt.graphicsenv

Может возвращать нулевое или какое-либо несуществующее имя класса, которое затем загружается и выдает исключение ClassNotFoundException. 1

Решение, похоже, заключается в указании свойства "java.awt.headless".

Это похожий вопрос: java.awt. Ошибка цвета

Попробуйте поиск , он показывает ситуации, аналогичные вашей.

Я помню, что что-то было и в базе данных ошибок от солнца.

Опубликуйте решение, когда найдете его!

1. GraphicsEnvironment.java

EDIT

Это не затмение !!

В моем оригинальном посте есть ссылка на исходный код класса, который выдает исключение.

Так как я выгляжу так, как будто вы пропустили это, я выложу это здесь для вас:

       public static synchronized GraphicsEnvironment getLocalGraphicsEnvironment() {
          if (localEnv == null) {
               // Y O U R   E R R O R  O R I G I N A T E S    H E R E !!! 
              String nm = (String) java.security.AccessController.doPrivileged
                  (new sun.security.action.GetPropertyAction
                   ("java.awt.graphicsenv", null));

              try {
  //                      long t0 = System.currentTimeMillis();
                  localEnv =
                      (GraphicsEnvironment) Class.forName(nm).newInstance();
  //              long t1 = System.currentTimeMillis();
  //              System.out.println("GE creation took " + (t1-t0)+ "ms.");
                  if (isHeadless()) {
                      localEnv = new HeadlessGraphicsEnvironment(localEnv);
                  }
              } catch (ClassNotFoundException e) {
                  throw new Error("Could not find class: "+nm);
              } catch (InstantiationException e) {
                  throw new Error("Could not instantiate Graphics Environment: "
                                  + nm);
              } catch (IllegalAccessException e) {
                  throw new Error ("Could not access Graphics Environment: "
                                   + nm);
              }
          }

          return localEnv;
      }

Вот что исполняется.

И в оригинальном сообщении, которое вы, похоже, не читали, я сказал, что код обращается к свойству "java.awt.graphicsenv"

Если тот другой проект, использующий ось, не имеет той же проблемы, это может быть связано с тем, что он может быть запущен в другой конфигурации tomcat, или библиотека осей предоставила доступ к этому свойству. Но мы не можем быть уверены. Это чистое предположение. Так почему бы вам не проверить следующее и посмотреть, что напечатано:

        String nm = (String) java.security.AccessController.doPrivileged
            (new sun.security.action.GetPropertyAction
             ("java.awt.graphicsenv", null));

    System.out.println("java.awt.graphicsenv = " + nm );

Если он печатает ноль, то вы теперь в чем проблема. У вас нет этого свойства в вашей системе, или безопасность запрещает вам его использовать.

Отсюда очень сложно сказать: "Перейдите и отредактируйте файл xyz и добавьте: fail = false " Итак, вы должны выполнить свою работу и попытаться выяснить, в чем истинная причина.

Начните с изучения того, что представляет собой выполняемый код (который я только что опубликовал), а затем поймите, что он делает и как работает весь этот AccessController.doPrivileged. (Вы можете использовать Google + StackOverflow для этого).

4 голосов
/ 11 ноября 2011

У нас была похожая проблема, и после большого количества проблем она была идентифицирована как связанная со свойством java.awt.headless. Проблема была решена путем явной установки опции JVM на

-Djava.awt.headless=true
3 голосов
/ 04 июня 2009

Это было запущено неделю назад, а теперь это не так.

ПОЭТОМУ ЧТО-ТО ВЫ ИЗМЕНИЛИ ЧТО-ТО МЕЖДУ «работающим» и «не работающим».

Вернитесь к рабочему конфигу (если можете) и тщательно отследите, что вы изменили. Если у вас нет резервной копии рабочей конфигурации, тщательно вернитесь к тому, что вы сделали между рабочим и нерабочим, пока не найдете то, что изменили.

Это может быть не код - это может быть файл конфигурации и т. Д.

Удачи,

-R

1 голос
/ 04 июня 2009

Если вы развертываете это на * nix, и у вас больше не работает система X Window, это могло бы объяснить это. Даже если вы это сделаете, если вы не экспортируете системную переменную DISPLAY в процесс, который запускает JVM, или если это так, но это не действительно, это может вызвать такую ​​проблему.

Это, по крайней мере, объясняет, почему вы не изменили конфигурацию в tomcat, но у вас все еще есть проблема.

1 голос
/ 04 июня 2009

Является ли этот сервер Java в режиме сервера - я слышал, что он не загружается в классах AWT.

0 голосов
/ 05 декабря 2011

Поскольку вы получаете NoClassDefFoundError из кода AWT, похоже, что Java не может загрузить библиотеки X Windows. Обратите внимание, что даже если вы работаете в режиме без головы ($ DISPLAY не указывает на сервер X Windows), AWT все еще требуется некоторое подмножество библиотек X11 для визуализации изображений. Смотрите, например, эту ссылку:

http://javatechniques.com/blog/linux-x11-libraries-for-headless-mode

Если что-то перестало работать и ваш код Java не изменился, возможно, библиотеки X11 были перемещены или удалены на вашем компьютере, или по какой-то другой причине ваша переменная среды LD_LIBRARY_PATH больше не указывает на них.

0 голосов
/ 05 июня 2009

Если ваш NoClassDefFoundError вообще не имеет сообщения, то это означает две вещи:

  1. JVM уже пыталась и не смогла загрузить класс. Обычно это означает, что JVM не смогла завершить статическую инициализацию для этого класса, то есть присвоить значения любым полям static и запустить любые блоки static { }. Часто это происходит потому, что классы, необходимые для этой статической инициализации, отсутствуют.
  2. Вы используете Java 5, а не Java 6. (В Java 6 вместо этого появляется сообщение «Не удалось инициализировать класс xyz ».)

Кажется, что проблемным классом является класс, имя которого является значением системного свойства java.awt.graphicsenv. Я бы начал с выяснения стоимости этого имущества. Что происходит, когда вы пытаетесь создать экземпляр этого класса?

...