манифест Class-Path не учитывается в модуле Wildfly - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь создать модуль Wildfly для клиента OpenText Documentum java. Ранее я упаковывал jar-файлы в файл .war, и мое приложение работало, но они весили 23 МБ.

В J2SE вы обычно просто добавляете основной jar-файл dfc.jar, и его зависимости добавляются автоматически, потому что Class-Path: запись в dfc.jar/META-INF/MANIFEST.MF. Однако в Wildfly 11 это не работает: я создал модуль, сделал так, чтобы мое веб-приложение зависело от него, но когда я пытаюсь загрузить класс DfException из основной банки, Wildfly не может найти одну из зависимостей, в той же папке:

Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/Signature
    at com.documentum.fc.common.DfException.<clinit>(DfException.java:710)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.foo.PrintClassloaders.printClassloader0(PrintClassloaders.java:50)

Возможно ли создать этот модуль без добавления всех банок вручную?

Вот что я сделал:

module add --name=documentum.dfc2 --absolute-resources="C:\Program Files\Documentum\Shared\dfc.jar"

src / main / resources / META-INF / MANIFEST.MF:

Dependencies: documentum.dfc2

PrintClassloaders. java:

Class.forName("com.documentum.fc.common.DfException");

сгенерированный модуль. xml:

<module xmlns="urn:jboss:module:1.1" name="documentum.dfc2">    
    <resources>
        <resource-root path="C:\Program Files\Documentum\Shared\dfc.jar"/>
    </resources>
</module>

df c .jar / META-INF / MANIFEST.MF:

Class-Path: All-MB.jar activation.jar aspectjrt.jar certj.jar commons-
 codec-1.3.jar commons-lang-2.4.jar configservice-api.jar configservic
 e-impl.jar cryptoj.jar cryptojce.jar cryptojcommon.jar dms-client-api
 .jar jaxb-api.jar jaxb-impl.jar jcifs-krb5-1.3.1.jar jcm.jar jcmFIPS.
 jar jcmandroidfips.jar jsr173_api.jar krbutil.jar log4j.jar questFixF
 orJDK7.jar util.jar vsj-license.jar vsj-standard-3.3.jar xtrim-api.ja
 r xtrim-server.jar

aspectjrt.jar находится в той же папке. Почему он не выбирается загрузчиком классов модуля?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

То, что вы пытаетесь там, выглядит очень странным для меня. Модули (= Java библиотеки) находятся в папке модулей, и развертывания должны содержать дескриптор развертывания, в котором перечислены все необходимые ему модули. В простейшем случае вам нужен только раздел зависимостей внутри файла jboss-deploy-structure. xml. См. http://docs.wildfly.org/12/Developer_Guide.html#jboss -deployment-structure-file

Каждый модуль может содержать несколько файлов JAR и зависеть от других модулей. Когда вы посмотрите на некоторые существующие файлы модулей. xml, вы увидите, как это происходит. Имена путей внутри модуля. xml должны быть относительными, иначе вы не сможете развернуть их на другом компьютере с другой структурой папок.

Для этого вам не нужен какой-либо файл манифеста.

0 голосов
/ 11 февраля 2020

Очевидно, чтобы добавить все зависимые файлы jar из манифеста Class-Path, вам необходимо явно создать элемент <resource-root> для каждого jar.

Для случаев, когда слишком много jar или есть глубокий иерархия Я создал инструмент, который рекурсивно анализирует манифесты и печатает команду jboss-cli для создания нужного модуля.

Example:
  C:\> java -cp org.foo.modulegen.Modulegen C:\some\main-jar.jar
Output:
  --absolute-resources="C:\some\main-jar.jar;C:\some\jar2.jar;..."

https://gist.github.com/basinilya/15db9267ec753941d098cfd2f7ff844d

Инструмент пытается чтобы открыть каждый аргумент командной строки как java.util.zip.ZipInputStream, находит и анализирует MANIFEST.MF с java.util.jar.Manifest, а затем делает то же самое для каждой записи в атрибуте Class-Path. Это также гарантирует не открывать один и тот же файл JAR дважды.

...