Может ли сервлет действительно получить доступ к банкам в директории lib Tomcat?

Фон первый:

  • Tomcat 6.0 в WindowsXP и OpenSUSE SLED 11.0 (одинаковые результаты на обеих платформах)
  • Oracle JDK v6
  • Весна 3.0
  • Javolution 5.5.1

У меня странная проблема с jar (javolution-5.5.1.jar), который использует мое приложение. У меня была эта банка в WEB-INF/lib в течение некоторого времени без каких-либо проблем. Мы определили, что этот jar-файл действительно должен находиться в директории lib Tomcat, а не в директории lib нашего приложения, потому что он используется несколькими приложениями, поэтому мы переместили его.

Однако это вызвало новую RuntimeException, пытающуюся получить доступ к классу (Scinv), который расширяет Struct из javolution.jar. Есть ли какая-то причина, по которой приложение не сможет получить доступ к классу в JAR из библиотеки Tomcat таким образом?

Мой класс (ненужные детали удалены):

import javolution.io.Struct;
public class Scinv extends Struct {
    public static methodA() {...}
    public static methodB() {...}
    public static class ProdRecs extends Struct {...}
    public static class ProdRec extends Struct {...}
}

Когда я пытаюсь получить доступ к статическим методам Scinv, которые используют статические вложенные классы, я получаю это:

Apr 5, 2011 3:40:50 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet inventory threw exception
java.lang.RuntimeException: Struct class: general.dao.externalfiles.Scinv$ProdRec not found
at javolution.io.Struct.array(Struct.java:557)
at general.dao.externalfiles.Scinv$ProdRecs.<init>(Scinv.java:447)

Apr 5, 2011 3:40:50 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.RuntimeException: Struct class: general.dao.externalfiles.Scinv$ProdRec not found
at javolution.io.Struct.array(Struct.java:557)
at general.dao.externalfiles.Scinv$ProdRecs.<init>(Scinv.java:447)

Все, что мне нужно сделать, это переместить javolution-5.5.1.jar из Tomcat/lib в мой каталог WEB-INF/lib, и приложение снова работает нормально, без исключений RuntimeException.

Любые идеи о том, почему это не удается? У нас также есть файл postgres-9.0.jar в Tomcat/lib dir, и он, кажется, работает нормально.

Я был бы рад предоставить более подробную информацию, если они вам понадобятся, и любые предложения будут оценены, так как я отчасти озадачен этим!

1 ответ

Решение

Я не думаю, что это проблема размещения javolution-5.5.1.jar в TOMCAT_HOME/lib папку, JVM бы беспокоиться о Struct объект уже (javolution.io.Struct.array(Struct.java:557)). Настоящая причина проблемы: что происходит с вашим конструктором в general.dao.externalfiles.Scinv$ProdRecs учебный класс (Scinv.java:447)? Что-то заставляет объект не инициализироваться и, следовательно, исключение времени выполнения.

Другие вопросы по тегам