将现有项目迁移到Maven和Wildfly,并不得不移动一些文件来造成以下情况。
ejb1.jar的ejb-jar.xml具有以下内容:
<ejb-jar>
<enterprise-beans>
<session id="Value">
..
<home>path.to.ejb1Home</home>
<remote>path.to.ejb1</remote>
...
home和remote标记中引用的类已移至core.jar内部
与此同时,ejb2.jar依赖于core.jar的其他部分。
最简单的解决方案似乎是创建一个全局模块并将core.jar放入其中,创建适当的module.xml并在standalone.sh中条目,以使其可用于所有部署。
module.xml
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="path.to">
<resources>
<resource-root path="core-1.0.jar"/>
</resources>
<dependencies>
</dependencies>
</module>
使用此设置,ejb2.jar会按预期部署,但ejb1.jar会引发以下错误:
Caused by: java.lang.NoClassDefFoundError: Failed to link path.to.ejb1
(Module "path.to" from local module loader @4c40b76e (finder: local
module finder @2ea6137 (roots: /opt/wildfly/modules,
/opt/wildfly/modules/system/layers/base))): javax/ejb/EJBObject
答案 0 :(得分:0)
您应该仔细考虑您的要求。通常,您不需要提供公共资源(尤其是应用程序接口)作为模块,尤其是作为全局模块。选择适合您需求的解决方案,而不是一眼就不知道其含义的解决方案。
我会按照给定的顺序推荐这些可能性(有关更多信息,请参见Class Loading in Wildfly Documentation)
jboss-deployment-structure.xml
文件,将此模块添加为附加依赖项。如果模块包含带注释的类或接口(在部署时应予以考虑),请使用模块依赖项配置设置属性annotations=true
。 jboss-deployment-structure.xml
文件的示例:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3">
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<deployment>
<dependencies>
<module name="my.custom.module" export="true" annotations="true"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
编辑:
在安装模块时,请不要忘记为您自己的模块所依赖的其他模块提供传递性模块依赖性。使用您的module.xml
文件进行操作。就您而言,您可能至少需要对javax.ejb.api
模块有依赖性。