英文:
Missing Modules for EAR Deployment in Wildfly
问题
我正在部署一个EJB项目,将其作为一个EAR文件在Jboss Wildfly 18中部署。我当前EAR的布局如下:
Person.ear->
META-INF->
jboss-deployment-structure.xml
MANIFEST.MF
...
lib->
Common.jar
BugReport.jar
Person-ejb.jar
Person-web.war
其中jboss-deployment-structure.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="Common.jar" export="TRUE"/>
<module name="BugReport.jar" export="TRUE"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
当我尝试启动服务器时,部署失败并出现以下错误:
15:00:20,234 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.module.service."deployment.Person.ear".main: org.jboss.msc.service.StartException in service jboss.module.service."deployment.Person.ear".main: WFLYSRV0179: Failed to load module: deployment.Person.ear
at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:116)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701)
at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.jboss.modules.ModuleNotFoundException: com.tura.optics.common
at org.jboss.modules.Module.addPaths(Module.java:1266)
at org.jboss.modules.Module.link(Module.java:1622)
at org.jboss.modules.Module.relinkIfNecessary(Module.java:1650)
at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:299)
at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:283)
at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:93)
... 8 more
我尝试通过jboss-deployment-structure.xml和MANIFEST.MF定义依赖项,但都没有成功。我还尝试使用包名(例如com.tura.common)命名依赖项,因为我看到这两种格式都被使用过。但仍然没有成功。我不太确定我漏掉了什么;看起来我在按预期布局进行操作。有谁可以帮助解决这个问题吗?
英文:
I'm working on deploying an EJB project as an EAR in Jboss Wildfly 18. The layout of my ear currently looks like this:
<pre>
Person.ear->
META-INF->
jboss-deployment-structure.xml
MANIFEST.MF
...
lib->
Common.jar
BugReport.jar
Person-ejb.jar
Person-web.war
</pre>
with a jboss-deployment-structure.xml like:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="Common.jar" export="TRUE"/>
<module name="BugReport.jar" export="TRUE"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
When I try to start up the server the deployment fails with the following error:
15:00:20,234 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.module.service."deployment.Person.ear".main: org.jboss.msc.service.StartException in service jboss.module.service."deployment.Person.ear".main: WFLYSRV0179: Failed to load module: deployment.Person.ear
at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:116)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701)
at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.jboss.modules.ModuleNotFoundException: com.tura.optics.common
at org.jboss.modules.Module.addPaths(Module.java:1266)
at org.jboss.modules.Module.link(Module.java:1622)
at org.jboss.modules.Module.relinkIfNecessary(Module.java:1650)
at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:299)
at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:283)
at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:93)
... 8 more
I have tried defining dependencies via the jboss-deployment-structure.xml and via the MANIFEST.MF with no success. I also tried naming the dependencies with the package name (i.e. com.tura.common) since I have seen both formats used. Still no luck. I'm not quite sure what I'm missing here; it seems like I am following the expected layout. Can anyone help with this?
答案1
得分: 0
不需要使用 jboss-deployment-structure.xml
作为EAR内JAR库的引用,因为Java EE平台规范(JSR 366)已经涵盖了对JAR库的引用。
实际上,根据您当前的EAR结构,删除 jboss-deployment-structure.xml
应该也可以正常工作。
EE.8.2.1 Bundled Libraries 部分提供了几种将JAR库提供给模块的方式。
- 您可以在使用库的模块的 META-INF/MANIFEST.MF 文件中添加一个 Class-Path 条目,引用 JAR 文件。
例如,如果 person-ejb.jar 依赖于 lib/Common.jar 和 lib/BugReport.jar,您可以添加:
Class-Path: lib/Common.jar lib/BugReport.jar
在文件 Person-ejb.jar 的 META-INF/MANIFEST.MF 中。对于 Person-web.war 同样适用。
- 放置在 EAR 的
<library-directory>
中的 JAR 文件将对所有模块可用。默认情况下,<library-directory>
是 lib 目录,所以由于您在 lib 目录中都有 Common.jar 和 BugReport.jar,它们应该已经对 Person-ejb.jar 和 Person-web.war 可用。
您可以在 EAR 文件的 META-INF 目录中提供一个 deployment descriptor application.xml
,并覆盖 <library-directory>
。您的 EAR 的一个示例 application.xml
文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_8.xsd"
version="8">
<display-name>Person.ear</display-name>
<module>
<ejb>Person-ejb.jar</ejb>
</module>
<module>
<web>
<web-uri>Person-web.war</web-uri>
<context-root>/person</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
英文:
There is no need of using jboss-deployment-structure.xml
as the reference of JAR libraries within the EAR is covered by the Java EE platform specification (JSR 366)
In fact, it should work with your current EAR structure, removing the jboss-deployment-structure.xml
The section EE.8.2.1 Bundled Libraries provides several ways to make JAR libraries available to modules.
- You can add a reference to the JAR file with a Class-Path entry in the META-INF/MANIFEST.MF file of the module using the library (not the EAR).
For example, if person-ejb.jar depends on lib/Common.jar and lib/BugReport.jar, you could add:
Class-Path: lib/Common.jar lib/BugReport.jar
in the META-INF/MANIFEST.MF inside de file Person-ejb.jar. Same for Person-web.war
- JAR files put in the
<library-directory>
of the EAR are made available to all modules. And<library-directory>
by default is directory lib, so, as you have both Common.jar and BugReport.jar inside the lib directory they should be already available to Person-ejb.jar and Person-web.war.
You can provide a deployment descriptor application.xml
in the META-INF directory of the EAR file, and override the <library-directory>
. An example application.xml
file for your EAR would be:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_8.xsd" version="8">
<display-name>Person.ear</display-name>
<module>
<ejb>Person-ejb.jar</ejb>
</module>
<module>
<web>
<web-uri>Person-web.war</web-uri>
<context-root>/person</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
专注分享java语言的经验与见解,让所有开发者获益!
评论