JBoss: файл WAR в EAR не может найти библиотеку JAR в пути к классам

У меня возникла проблема с развертыванием уха со связанными wars, jar-файлами и файлами конфигурации (файлы .properties) на JBoss 4.3-eap. Вот структура моего уха:

+app.ear   
  +lib  
    *.jar libraries that the war's use  
    +classes  
      *.properties and other configuration files 
  +META-INF  
    application.xml  
    jbos-app.xml  
  app.war  
  app2.war  
  appn.war  

В моем jboss-app.xml есть следующее:

<jboss-app>
  <jmx-name>app.startup.JbossStartUpServer:service=JbossStartUpService</jmx-name>
</jboss-app>    

Мой application.xml выглядит так:

<application id="app_id">
  <display-name>App>/display-name>
  <description>TheApp>/description>
<!--  
  <module  id="core">
    <java>lib/core.jar</java>
  </module>

  <module id="tag">
    <java>lib/tag.jar</java>
  </module>
-->  
  <module id="app">
    <web>
      <web-uri>app.war</web-uri>
      <context-root>/</context-root>
    </web>
  </module> 

  <module id="app2">
    <web>
      <web-uri>app2.war</web-uri>
      <context-root>/app2</context-root>
    </web>
  </module> 

  <module id="appn">
    <web>
      <web-uri>appn.war</web-uri>
      <context-root>/appn</context-root>
    </web>
  </module>

  <security-role id="secRole">
    <description>users</description>
    <role-name id="appRoleName">users</role-name>
  </security-role>

  <library-directory>lib</library-directory>

</application>

По сути, после развертывания уха я столкнулся с проблемой, когда одна из моих войн не может найти класс в файле core.jar (java.lang.NoClassDefFoundError). Я думаю, это связано с тем, что война не находит эту библиотеку, даже несмотря на то, что она находится в папке lib/classpath. Если я попытаюсь раскомментировать первые два модуля, чтобы добавить библиотеки первой партии (core.jar и tag.jar), то вдруг файлы свойств перестанут быть найдены (они находятся пока в lib/classes, так что, надеюсь, все же , они подхватываются загрузчиком классов. В идеале я хотел бы поместить классы в свой собственный каталог и добавить его в путь к классам отдельно, но пока я просто пытаюсь заставить это работать).

Я пробовал некоторые другие вещи, включая ручное добавление core.jar в файл войны manifest.mf, изменение UseJBossWebLoader на true в файле jboss-service.xml под jboss-web.deployer и различные комбинации вышеперечисленного, но безуспешно. Я либо теряю каталог classes из пути к классам (папка lib), и ни один из моих файлов свойств не подбирается, либо война не может получить доступ к нужному классу из jar. Я думаю, что должна быть какая-то неправильная конфигурация, и хотя я пытался читать о том, как JBoss выполняет развертывание EAR и загрузку классов, я не могу адаптировать его к моей текущей настройке.

Любые предложения будут ценны.

Вот несколько сайтов, которые я просматривал:
Raible Designs JBoss ClassLoader Logic

Это всего лишь несколько сайтов, которые я просмотрел. Проблемы также могут быть связаны с настройкой проекта, так как это большой устоявшийся проект, который (в некоторой степени) переносится с развертывания weblogic на Jboss. Поэтому, если есть что-то, что ДОЛЖНО работать, но не работает, это может быть проблема с какой-то конфигурацией кода/проекта. К сожалению, я еще не на том этапе, когда могу сказать, связана ли проблема с JBoss или с проектом.


person Mike    schedule 25.08.2009    source источник


Ответы (1)


Тег <library-directory> в application.xml является функцией JavaEE5, и я не думаю, что JBoss 4.3 полностью совместим с JavaEE5 (да, он может выполнять EJB3, но это лишь частичная поддержка).

Поэтому вам нужно вернуться к использованию явно объявленных файлов JAR:

<module>
    <java>lib/core.jar</java>
</module>

Что касается ваших файлов свойств, вам нужно добавить каталог, в котором они находятся, в качестве java-модуля, поэтому для вашего примера:

<module>
    <java>lib/classes</java>
</module>
person skaffman    schedule 26.08.2009
comment
Это решило мою проблему! Большое спасибо! Однако я хотел бы задать дополнительный вопрос: если я добавлю эти модули в application.xml, означает ли это, что мне не нужно свойство class-path в файлах manifest.mf войн? Или это только в том случае, если я установил для атрибута UseJBossWebLoader в jboss-web.deployer значение true? - person Mike; 26.08.2009
comment
Я не уверен насчет проблемы с манифестом, я сам этого не пробовал, я всегда полагаюсь на стандартный загрузчик классов по умолчанию. Что касается вашего форматирования, не используйте теги core/pre, они не очень хорошо работают. Используйте значки форматирования в редакторе. - person skaffman; 26.08.2009