我有一个简单的EAR文件,配置如下:
app.ear
|-- lib/...
|-- META-INF/application.xml
|-- core.jar
| |-- test/MyServiceImpl.class
| `-- META-INF/MANIFEST.MF // Class-Path: core-api.jar
|-- core-api.jar
| `-- test/MyService.class
`-- web.war
`-- META-INF/MANIFEST.MF // Class-Path: core.jar core-api.jar
application.xml文件如下所示:
<?xml version="1.0"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" id="app 1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
<application-name>MyApp</application-name>
<display-name>My App</display-name>
<module id="mod 1">
<java>core-api.jar</java>
</module>
<module id="mod 2">
<java>core.jar</java>
</module>
<module id="mod 3">
<web>
<web-uri>web.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
当我尝试将应用程序部署到服务器时,出现以下异常:
[*] 00000088 SystemErr R Caused by: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.NoModuleFileException: A file does not exist for module element having uri: core-api.jar
[*] 00000088 SystemErr R at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ModuleRefImpl.checkType(ModuleRefImpl.java:591)
[*] 00000088 SystemErr R at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ModuleRefImpl.initModuleFileFromEAR(ModuleRefImpl.java:167)
[*] 00000088 SystemErr R at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ModuleRefImpl.getModuleFile(ModuleRefImpl.java:120)
[*] 00000088 SystemErr R at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.EARFileImpl.getModuleFile(EARFileImpl.java:165)
[*] 00000088 SystemErr R at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.EARFileImpl.getDeploymentDescriptor(EARFileImpl.java:817)
[*] 00000088 SystemErr R at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ModuleRefImpl.getDeploymentDescriptor(ModuleRefImpl.java:230)
[*] 00000088 SystemErr R ... 49 more
我正在使用Websphere测试环境v8.5.5.0
**更新:**我怀疑可能是压缩算法用于压缩耳朵文件可能是罪魁祸首,似乎我是正确的;使用7zip解压缩和重新压缩ear文件可以使部署正常工作。
我使用gradle作为构建工具,它提供了自己的压缩归档机制。我尝试将entryCompression
模式设置为ZipEntryCompression.STORED
,但没有成功。
这就引出了一个新问题:
1.如何控制ear文件的组装/压缩以符合Websphere的期望?
以及
- gradle用什么方法来压迫耳朵?
**更新2:**查看gradle源代码,我可以看到Zip实现使用了ant的org.apache.tools.zip.ZipOutputStream
(1.9.3)。以前有人在此过程中遇到过困难吗?
**更新3:**看起来好像我一直在转移注意力。我检查了应该正确部署的文件,发现ear在其根目录之上包含了一个额外的文件夹级别(即app.ear!app/<root>
)。
假设压缩算法与此无关,有人有什么想法吗?
**更新4:**好了,我已经很接近了,在检查了一些示例ear文件和测试了各种理论之后,我设法让部署工作起来。我做了这些事情,它工作了(见更新5)。
- 在application.xml中,我使用了ejb模块,而不是java模块
- 我在core.jar中包含了一个基本的META-INF/ejb-jar.xml文件(尽管规范说您不需要它们),因为websphere显然不喜欢缺少它
- 我从application.xml中删除了core-api.jar模块
所以我现在有了下面的application.xml:
<?xml version="1.0"?>
<application ...>
<application-name>MyApp</application-name>
<display-name>My App</display-name>
<module id="mod 1">
<ejb>core.jar</ejb>
</module>
<module id="mod 2">
<web>
<web-uri>web.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
最后一个问题:我如何将工件“部署”到ear项目而不将其添加到应用程序xml?或者,我如何在部署解决后定制application.xml?
**更新5:**为我的问题的波动状态道歉。
虽然应用程序成功部署,但它没有启动,给我一个错误消息,说我的ejb jar没有ejb.我已经决定,遵循我收到的建议和下面的回答,我的基于spring的jar被归类为“utility”jar,应该保存在lib文件夹中。
我希望将来在EJB中使用这些jar,所以希望将它们保存在lib文件夹中,而不是直接保存在war中。
这是我最后的应用程序.xml:
<?xml version="1.0"?>
<application ...>
<application-name>MyApp</application-name>
<display-name>My App</display-name>
<module>
<web>
<web-uri>web.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
感谢您的时间和耐心。
1条答案
按热度按时间wsewodh21#
我可以从application.xml标头中看到您正在使用JavaEE 6打包,并且您还提到您正在使用WebSphere 8.5.5,因此请遵循一些 Package 信息。
如果您使用带注解的EJB 3.x并遵循标准打包约定,则根本不需要application.xml:
请注意,这是Java EE 6结构的默认打包方式,在此之后,您放置在lib目录中的所有实用程序jar都将可用于该目录中的EJB和WAR,因此,仅当EJB和Web应用程序都需要您的实用程序jar时,才应使用此目录。如果您的实用程序jar仅由Web应用程序使用,则应将它们打包在标准WEB-INF/lib文件夹中,您的war包。
现在,如果您将EJB 2.x与您的包一起使用,那么您将需要application.xml并声明您的ejbs和war,您应该保留推荐的方法,即将实用程序jar放在lib文件夹中,将仅Web层需要的jar放在war包的lib文件夹中。
如果出于任何原因,你想把你的实用程序jar保存在根目录或者EAR中,你可以使用在EAR的清单中声明它们的方法,但是你不能也不能在war包的清单中再次声明它们。在EAR清单中声明的所有jar将自动被war文件和EJB的类加载器看到。
javaEE 6规范第8章“应用程序组装和部署”有关于这个主题的完整解释。