2013-04-10 1 views
3

Моего EAR имеет следующую структуру:Уха библитеков метания ClassNotFoundException для члена WAR (другого)

lib/ 
    helper.jar (Helper classes used both by war1.war and war2.war) 
war1.war 
    WEB-INF/ 
     lib/ 
      entities1.jar 
war2.war 
    WEB-INF/ 
     lib/ 
      entities2.jar 

Когда war1 называет класс в helper.jar, что сам по себе вызывает Class.forName ("класс в war1 "), он выбрасывает ClassNotFoundException.

Обратите внимание, что люди обычно имеют ClassNotFoundException, когда военный класс загружает класс уха/lib. Мое дело - обратная ситуация.

My EAR развернут в Glassfish 3.1.2.

Я видел подобный случай, но в JBoss, «EAR lib's class throwing a ClassNotFoundException for a WAR member», но ответы говорят, что это проблема «циклической зависимости». Однако здесь я не вижу проблемы с циклической зависимостью. В Java, любой ClassX может относиться к классным даже если классным относится к ClassX ....

ответ

3

В helper.jar вы не можете просто загрузить класс, расположенный в вашей war1.war с помощью Class.forName.

Ограничение происходит от загрузчиком классов по умолчанию, используемый метод Class.forName, что загрузчик классов на предприятии приложения в (тот, который загружает helper.jar), который знает только его родители, а не своих детей (war1.war и war2.war загрузчиков классов).

Решение вашей проблемы заключается в использовании явно в контексте загрузчика, который сканирует в порядке:

войны -> Ухо -> Системы -> Расширение -> самозагрузка

Это может быть сделано с помощью :

Class.forName("war1Class.class",true,Thread.currentThread().getContextClassLoader()) 
+0

Большое спасибо за решение и объяснения. **Оно работает**. –

+0

Добро пожаловать. –

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