2009-06-04 3 views
6

У меня есть приложение, которое работает на tomcat, одним из методов является создание простого миниатюры из jpeg-изображения. Функции работают отлично в автономном режиме и неделю назад также на tomcat. Но теперь я получаю следующее сообщение об ошибке:NoClassDefFoundError при доступе к GraphicsEnvironment.getLocalGraphicsEnvironment на 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 не решает проблему. В другом проекте точно такой же код, но внутри web-сервиса axis2 на этом сервере работает нормально. [/ edit]

+4

У вас нет класса. – user105033

+0

Работает ли он в безголовом режиме? –

+1

В стеке должно быть указано имя отсутствующего класса - не так ли? –

ответ

6

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

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

Видимо

GraphicsEnvironment.getLocalGraphicsEnvironment() 

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

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

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

Это аналогичный вопрос: java.awt.Color error

Попробуйте search, это показывает, подобные ситуации, как ваш.

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

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

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).

+0

Нет, это не так. На самом деле я забыл упомянуть об этом, но это не очень важно, в другом проекте, где webservice развертывается с осью2, эта функция действительно работает на том же сервере tomcat 5.5. Я все еще пробовал режим безголового, ничего не изменил. Tomcat такой же, как неделю назад, я могу только предположить, что что-то в eclipse (а не в коде) изменилось, потому что нет другого возможного выхода, но все же я не могу найти решение. – Red33mer

+0

Это вызовет ошибку, а не NoClassDefFoundError, которая является подклассом. И он будет сообщать имя класса, который он искал. – Yishai

+0

@Yishai: За исключением, если NoClassDefFoundError брошен кулаком вправо? Раздел catch обрабатывает 3 Exception, но не ошибку (потому что их не следует обрабатывать на первом месте). Если NoClassDefFoundError выбрано, он не будет обрабатываться в try/catch и появится в stacktrace (как сообщает Red33mer) NoClassDefFoundError ! = NoClassDefFoundException. http://bit.ly/ncdfe! = Http://bit.ly/cnfep – OscarRyz

1

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

+0

Нет, это не так, неделю назад это действительно сработало. Конфигурация tomcat не была изменена с тех пор. Я думаю, вы видите, почему эта ошибка меня озадачивает. – Red33mer

+0

Хм, было обновление ОС - новая версия драйверов x.org или nvidia/intel/ati linux? Я вижу, что Native метод в stacktrace ... – JeeBee

+0

Нет, у меня не было обновления ОС. – Red33mer

3

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

ПОЭТОМУ, ВЫ ИЗМЕНЕНЫ ЧТО-ТО МЕЖДУ «РАБОЧИМ» и «НЕ РАБОТАЕТ».

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

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

удачи,

-R

+0

Да, я понял, что-то изменилось, все же, я проверил старую версию из svn, все еще не работая, конфигурация tomcat не была изменена или даже не затронута с тех пор. На самом деле это причина, по которой я задаю этот вопрос, потому что я, честно говоря, не могу это объяснить. – Red33mer

1

При развертывании это на * NIX, и вы не» t уже работает система окон X, что может объяснить ее. Даже если вы это сделаете, если вы не экспортируете системную переменную DISPLAY в процесс, запускающий JVM, или если вы находитесь, но на самом деле он не действителен, это может вызвать такую ​​проблему.

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

+0

На самом деле у меня есть такая же функция в другом проекте, развернутом на этом tomcat, который вместо этого использует axis2, и он работает. Но если это проблема системной переменной DISPLAY, она тоже должна работать. Я действительно думаю, что затмение что-то привнесло, потому что я не вижу другого объяснения. – Red33mer

0

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

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

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

4

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

-Djava.awt.headless=true 
0

Поскольку вы получаете 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 больше не указывает на них.

Смежные вопросы