Wildfly - 模块 - 确定包和依赖项信息的“正确”方法是什么?

ben*_*min 5 java installation module wildfly

我正在将一些较旧的 Web 应用程序部署到 Wildfly 10 中,并意识到设置应用程序服务器的一个方面我只是糊涂了。我认为现在是时候尝试并真正理解我正在做的事情了。

具体来说,我不清楚以下两个有关为应用程序服务器设置模块的问题:

  • 模块经过配置,使得 module/ 目录中包含与 JAR 中类的包名称相对应的子目录。我总是用 7zip 之类的程序破解 JAR 以检查其结构,然后复制它。

有没有一种“正确”的方法来预测这些信息?是否假设 JAR 的创建者会提供它?

  • 当您创建 module.xml 文件时,系统会要求您指定所引用的 JAR 的依赖项。例如,JDBC 驱动程序经常依赖于 Java 持久性类之类的东西。

与上面类似,JAR可以定义这些信息吗?我知道在某些情况下会有一个 MANIFEST 文件似乎提供类似的东西,但情况似乎并不总是如此。有没有办法使用清单中的信息(假设存在)来创建适当的模块信息?

Jam*_*ins 4

模块名称与包名称匹配没有硬性规则。模块通常只使用包名称,因为它可能是唯一的命名空间。例如,您可以创建一个名为examplepackage 的模块com.example。只module.xml需要在$JBOSS_HOME/modules/example/main。请注意,这main是模块的默认插槽。

在 中,module.xml您只需要引用您的 jar 文件和所需的任何依赖项。如果您希望依赖项本身成为模块,那么您需要在module.xml文件中显式声明它们。如果您不关心每个依赖项都有自己的模块,您可以将它们全部作为资源包含在您的module.xml.

使用资源依赖项的示例模块:

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="example">
    <resources>
        <resource-root path="example.jar"/>
        <resource-root path="guava-19.jar"/>
    </resources>
</module>
Run Code Online (Sandbox Code Playgroud)

在上述情况下,example.jarguava-19.jar库需要位于$JBOSS_HOME/modules/example/main目录中。

使用模块依赖项的示例:

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="example">
    <resources>
        <resource-root path="example.jar"/>
    </resources>

    <dependencies>
        <module name="com.google.guava"/>
    </dependencies>
</module>
Run Code Online (Sandbox Code Playgroud)

在上面的情况下,只需example.jar在目录中即可$JBOSS_HOME/modules/example/main

您还可以使用module addCLI 命令将模块添加到 WildFly。同样,模块名称并不重要,只要它是唯一的即可。例如,以下是如何使用 CLI 添加 PostgreSQL 模块。

module add --name=org.postgresql --resources=~/Downloads/postgresql-9.4-1203.jdbc42.jar --dependencies=javax.api,javax.transaction.api
Run Code Online (Sandbox Code Playgroud)

使用 CLI 添加模块可以避免手动创建模块结构和module.xml文件。唯一的问题是 CLI 和 WildFly 必须位于同一文件系统上,并且运行 CLI 的用户需要具有$JBOSS_HOME/modules. 该命令将自动创建目录结构,复制资源并生成文件module.xml

MANIFEST.MF条目而言。JBoss Modules 确实有一个用于定义名为 的模块依赖项的输入键Dependencies:。不过,我发现使用module.xml更好一些,因此如果您需要添加模块依赖项或删除模块依赖项,则无需重建或修改二进制文件。然而,对于部署来说,使用该MANIFEST.MF条目可能是有意义的。

如果您还没有看到它,请查看WildFly 文档中的类加载。这将主要解释部署的类加载如何工作。

  • 另外,为了列出模块本身的依赖关系,您还可以使用 jboss-modules 本身来帮助您。像 java -jar jboss-modules -mp &lt;path-to-modules-dir&gt; -deptree &lt;name-of-module&gt; 之类的东西将为您提供传递模块的完整依赖关系树。 (2认同)