maven skinnyWars不会从WEB-INF\lib中删除ejb JAR\
我在网站上偶然发现了maven主题maven skinnyWars不会从WEB-INF\lib中删除ejb JAR\,maven,ejb,war,ear,skinny-war,Maven,Ejb,War,Ear,Skinny War,我在网站上偶然发现了maven主题skinnyWars。如上所述,我可以使用此方法将选定的依赖项从WAR模块移动到EAR模块。它们将可用于EAR中的所有其他WAR模块 正如我发现的,被移动的依赖项必须在EAR模块中声明,并且必须包含在META-INF\lib目录中不适用于位于EAR模块根目录中的EJB模块 我的问题是如何从WAR中删除重复的EJB模块,并将引用指向EAR文件中的那些模块 现在的结构是这样的: \-EAR -ejb.jar -META-INF\lib -shared l
skinnyWars
。如上所述,我可以使用此方法将选定的依赖项从WAR模块移动到EAR模块。它们将可用于EAR中的所有其他WAR模块
正如我发现的,被移动的依赖项必须在EAR模块中声明,并且必须包含在META-INF\lib
目录中不适用于位于EAR模块根目录中的EJB模块
我的问题是如何从WAR中删除重复的EJB模块,并将引用指向EAR文件中的那些模块
现在的结构是这样的:
\-EAR
-ejb.jar
-META-INF\lib
-shared libraries
-web.war
-WEB-INF\lib
-ejb.jar
-other non-shared libraries
我回答了一个类似的问题: 不幸的是,这似乎不适用于ejb模块。正如你已经提到的,它们将被复制 另外,您还可以使用maven war插件的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
</configuration>
</plugin>
org.apache.maven.plugins
maven战争插件
2.4
WEB-INF/lib/*.jar
这将完全清除WAR的lib文件夹中的所有内容,但在您必须在没有周围EAR的单独机器上另外部署WAR的情况下,它也有其缺点。这里的问题是,从EAR模块引用EJB将用于将其部署到而不是从需要EJB类与服务器接口的客户端引用它
如果在EAR模块中包含依赖项,它将认为您正在声明要部署的EJB模块。它将把它放在EAR的根目录中,并在application.xml中声明它
例如,如果您在war模块中包含依赖项,您将得到完全相同的工件,但它将被视为一个库并放在WEB-INF/lib中现在,当你正在生成瘦战时,对EJB模块的显式依赖性<强>>< /强>匹配战争中的依赖关系,因为Maven不认为它们是同一事物。这导致罐子被保存在使用它的战争中
我知道的唯一解决方案是始终为ejb模块生成客户机工件,即使客户机工件与主工件相同 现在,您只在EAR中使用ejb
依赖项。对于客户端,您总是使用ejb客户端
要从WAR/s中删除客户机并将其定位在EAR的lib目录中,您必须显式地将依赖项添加到EAR模块中
因此,ear模块中的ejb模块有两个依赖项:一个依赖于ejb本身,另一个依赖于客户端。第一个将把EJB放在EAR的根目录中,并在application.xml中声明它。第二个将把客户机放在EAR的lib目录中,并在必要时更新WAR/s manifest/s
但如果客户机和主工件是相同的,那么您会复制它吗
简而言之,答案是肯定的。答案很长,是的。它确实被复制了,但只有一次,而且不是在每次战争中都使用它。我不认为有一个干净的方法可以避免这种情况,我也不确定它在概念上是否有意义。当然,您可以使用PackageExcludes和定制清单,但是两次使用JAR是有意义的
如果您的客户机JAR非常薄(例如,只有接口),具有WAR/s引用,那么客户机JAR实际上不允许它们访问EJB实现,这总是一个好主意
你可以把同一个jar视为前一个特殊的情况,并使它们保持独立的概念意义。
因此,我的建议是始终为ejb生成一个客户机工件,并按照说明进行操作。总是有一些东西可以从中排除,至少是任何不需要的非类文件,如package.html或ejb jar.xml。我认为这个问题可以帮助您:您是否找到了这个问题的干净解决方案?我现在也遇到了同样的问题,无法将其正确清理。我找到的最干净的解决方案是对WEB-INF/lib目录中的所有jar文件使用
元素,然后使用
包含所有必要的lib,我很快就尝试了,但是我看到Manifest.MF没有使用根目录中的EJB pkg名称进行更新。你有同样的问题吗?您是否也必须指示war打包程序手动添加类路径条目?我发现的最干净的解决方案是使用war的POM中声明的EJB依赖项提供的解决方案。谢谢,我最终不得不这样做到2016年,目前还没有解决方案??我在war pom文件中使用了将ejb.jar声明为“提供”的策略。。。然而,使用这种策略,我失去了自己部署战争的能力。。。