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

时间:2016-06-18 04:35:40

标签: java module installation wildfly

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

具体来说,我不清楚以下两个有关正确设置app服务器模块的问题:

  • 模块的配置使得modules /目录中的子目录对应于JAR中类的包名。我总是在像7zip这样的程序中打开JAR来检查结构然后复制它。

有没有“正确”的方法来判断这些信息?是否假设JAR的创建者提供了它?

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

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

1 个答案:

答案 0 :(得分:3)

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

module.xml中,您只需要引用您的jar文件和所需的任何依赖项。如果您希望依赖项是自己的模块,那么您需要在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> 中。

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

example.jar

在上述情况下,guava-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> 目录中。

使用模块依赖关系的示例:

example.jar

在上述情况下,只有$JBOSS_HOME/modules/example/main需要位于module add目录中。

您还可以使用module add --name=org.postgresql --resources=~/Downloads/postgresql-9.4-1203.jdbc42.jar --dependencies=javax.api,javax.transaction.api CLI命令将模块添加到WildFly。只要模块名称唯一,模块名称就不重要了。例如,您可以通过CLI添加PostgreSQL模块。

module.xml

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

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

如果您还没看到它,请查看class loading in WildFly documentation。这将主要解释部署的类加载如何工作。