Почему мы должны объявлять зависимости от манифеста JBOSS 8 (wildfly)?

учитывая следующее EAR:

  • my-app.ear
    • my-ejb.jar
    • мой-webapp.war
    • lib
      • my-lib.jar

my-ejb нужна библиотека оракула для работы с пространственным оракулом для построения геометрии и хранения данных. Модуль оракула корректно загружается JBOSS 8 (wildfly).

Когда я запустил приложение, я получил ClassNotFoundException oracle.sql.STRUCT.

ОК, я добавил зависимость драйвера oracle ojdbc6.jar от my-ejb META-INF/manifest.mf.

Class-Path: ojdbc6.jar
Dependencies: oracle.sql 

Когда я запустил приложение, я получил ClassNotFoundException oracle.sql.StructDescriptor. Я знаю, что когда я читаю данные в набор результатов и из него, объект, выходящий из набора результатов, является экземпляром класса oracle.sql.STRUCT, но oracle.sql.StructDescriptor находится в том же пакете.

Хорошо, я добавил ту же зависимость драйвера оракула ojdbc6.jar к моей библиотеке META-INF/manifest.mf.

И это работает!

мой вопрос

  • какова роль манифестов в JBOSS 8?
  • почему в oracle weblogic мне НЕ нужно добавлять эти зависимости в manifest.mf?

person giusy    schedule 14.08.2014    source источник


Ответы (2)


Чтобы ответить на ваш вопрос:

  • Какова роль манифестов в JBOSS 8?

Манифесты создаются автоматически всякий раз, когда создается архив jar. У JBOSS 8 нет конкретной роли, кроме общего назначения. В конкретном случае, если файл jar, скажем, file1.jar, зависит от некоторых классов, принадлежащих другому файлу jar, скажем, файлу file2.jar, то эти файлы jar должны быть загружены в то время, когда file1.jar загружается. Теперь хитрость заключается в том, что всякий раз, когда файл jar загружается загрузчиком классов, манифест - это способ сообщить загрузчику классов о загрузке других jar-файлов, которые нужны этому jar-файлу. (проверьте эту ссылку) Это причина, по которой ваш код не работает, когда ojdbc6.jar отсутствует в манифесте.

  • почему в oracle weblogic мне НЕ нужно добавлять эти зависимости в manifest.mf?

Ну, это потому, что в oracle weblogic файл ojdbc6.jar поставляется вместе с сервером weblogic и уже загружен при запуске сервера. Обратите внимание, что даже если вы включили файл ojdbc6.jar в свое приложение, он не используется. Вот соответствующая документация для этого.

person Santosh    schedule 14.08.2014

Сантош дал правильный ответ, но позвольте мне прояснить некоторые вопросы, касающиеся weblogic и jboss.

JBOSS и WebLogic имеют разные механизмы загрузки классов. Позвольте мне уточнить:

<сильный>1. зачем манифестировать?

Ответ Java-Oracle: вам может понадобиться ссылаться на классы в других файлах JAR из файла JAR.

<сильный>2. зачем манифестировать в приложении EAR/WAR?

Ответ Oracle Weblogic: WebLogic Server поддерживает дополнительные пакеты, как описано в Спецификации Java EE 5.0, Раздел 8.2 Поддержка дополнительных пакетов, с управлением версиями, описанным в разделе Управление версиями дополнительных пакетов. Дополнительные пакеты предоставляют функции, аналогичные библиотекам Java EE, что позволяет легко совместно использовать один файл JAR в нескольких приложениях. Как и в случае с библиотеками Java EE, необязательные пакеты должны быть сначала зарегистрированы в WebLogic Server путем развертывания связанного файла JAR в качестве дополнительного пакета. После регистрации пакета вы можете развернуть модули Java EE, которые ссылаются на пакет в своих файлах манифеста.

Необязательные пакеты отличаются от библиотек Java EE тем, что на дополнительные пакеты можно ссылаться из любого модуля Java EE (архив EAR, JAR, WAR или RAR) или каталога развернутого архива. На библиотеки Java EE можно ссылаться только из действительного корпоративного приложения.

[...]

Любое приложение или модуль Java EE может ссылаться на необязательный пакет (с помощью META-INF/MANIFEST.MF), тогда как только корпоративные приложения и веб-приложения могут ссылаться на общую библиотеку Java EE (с помощью weblogic-application.xml или weblogic.xml).

<сильный>3. тогда почему мы не должны объявлять java-ee-api.jar, jsf, jsp,...

Ответ Jboss. В следующей таблице перечислены модули, которые автоматически добавляются в развертывания в качестве зависимостей, а также условия, вызывающие зависимость.

Implicit_Module_Dependencies

<сильный>4. не все модули загружаются JBOSS?

Ответ Jboss: в этой главе речь пойдет о том, как приложения, упакованные в jar-файлы, могут объявить, что они зависят от одного или нескольких модулей:

Dependencies: oracle.sql, another.module.with.version:1.0

Информация о модуле манифеста

4.1 альтернативно определяют jboss-deployment-structure.xml

<jboss-deployment-structure>

   <deployment>

      <dependencies>
         <module name="oracle.sql" export="TRUE" />
      </dependencies>

   </deployment>

</jboss-deployment-structure>

Добавить явную зависимость модуля к развертыванию

4.2 с maven

<plugins>

   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-war-plugin</artifactId>
      <configuration>
         <archive>
            <manifestEntries>
               <Dependencies>org.javassist, org.apache.velocity</Dependencies>
            </manifestEntries>
         </archive>
      </configuration>
   </plugin> 

</plugins>

см.: Создание записей MANIFESTMF с помощью Maven

см.: Как вы создаете зависимости модулей в MANIFEST.MF для JBoss AS 7 с помощью maven?

<сильный>7. почему мы не получили эту важную информацию раньше?

Благодаря новой организационной модели JBOSS 7/8 отказывается от известной иерархии загрузки классов и переключается на более простую модель, основанную на использовании модульных блоков (Проект модулей JBoss) . Введение архитектурных модулей (в дополнение к предстоящему внедрению в JDK, которое в настоящее время очень популярно благодаря внешним проектам, таким как OSGi) фактически расширяет модель, используемую для упаковки приложений Java EE; тогда модуль может быть библиотекой, набором классов или, в более общем смысле, набором ресурсов, связанных с одним загрузчиком классов: поэтому, в отличие от прошлого, когда загрузчик классов был собран в рамках иерархической организации набора классов, точка здесь точка зрения совершенно обратная.

см.: Загрузка классов в WildFly

person venergiac    schedule 15.08.2014