Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
maven skinnyWars不会从WEB-INF\lib中删除ejb JAR\_Maven_Ejb_War_Ear_Skinny War - Fatal编程技术网

maven skinnyWars不会从WEB-INF\lib中删除ejb JAR\

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

我在网站上偶然发现了maven主题
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声明为“提供”的策略。。。然而,使用这种策略,我失去了自己部署战争的能力。。。