我有一个项目,其中3个war模块封装在一个ear模块中。我的问题是,每个库jar都包含在每个war模块和ear模块中,这使得生成的ear文件非常大(目前约为190MB)。
我在这里学习了关于与maven进行瘦战争的教程:http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html
有了这个,我设法将ear的大小降到了45MB左右,这很好,但当我试图部署到glassfish时,它抱怨缺少一些类。
我发现这是由于对appfuse struts的依赖,它被打包为war文件。这包括在一个战争项目中使用warpath dependency。
因为关于制作瘦战争的教程指出,战争中发现的所有依赖项也必须在ear中定义。我试过了,但appfuse-struts依赖性是一个warpath,所以这不起作用。(当只将war依赖项添加到ear-pom时,它会抱怨找不到一些类,而当添加warpath依赖项时,maven会抱怨它不知道warpath是什么。)
当战争使用warpath依赖关系时,如何用瘦战争创建耳朵?
我想我可能已经找到了一个解决方案:
在瘦战争教程中,应该将WEB-INF/lib/*.jar添加到packageExcludes中。然后,所有的依赖项都将添加到ear配置中,使其可用于jar。
问题是war打包的依赖项不会将其可传递依赖项添加到ear的lib文件夹中,因此它们要么需要找到进入ear lib文件夹的方法,要么需要找到war包的WEB-INF/lib文件夹。
我选择使用最后一个,将它们添加到war文件的WEB-INF/lib中。
要做到这一点,首先通过执行mvn dependency:tree
来获得包含war/wwarpath资源的war项目的依赖树。
接下来,找到warpath dependency。在我的案例中,它看起来是这样的:
+- org.appfuse:appfuse-struts:warpath:2.0.2:compile
| +- org.appfuse:appfuse-web-common:war:2.0.2:compile
| +- org.appfuse:appfuse-web-common:warpath:2.0.2:compile
| +- displaytag:displaytag:jar:1.1.1:compile
| | - org.slf4j:jcl104-over-slf4j:jar:1.4.2:compile
| +- commons-fileupload:commons-fileupload:jar:1.2.1:compile
| +- org.apache.commons:commons-io:jar:1.3.2:compile
| +- org.appfuse:appfuse-service:jar:2.0.2:compile
| | +- velocity:velocity:jar:1.4:compile
| | | - velocity:velocity-dep:jar:1.4:runtime
| | +- org.codehaus.xfire:xfire-java5:jar:1.2.6:compile
| | | +- org.codehaus.xfire:xfire-aegis:jar:1.2.6:compile
| | | | - net.java.dev.stax-utils:stax-utils:jar:20040917:compile
| | | +- org.codehaus.xfire:xfire-annotations:jar:1.2.6:compile
| | | +- xfire:xfire-jsr181-api:jar:1.0-M1:compile
| | | - org.codehaus.xfire:xfire-core:jar:1.2.6:compile
| | | +- stax:stax-api:jar:1.0.1:compile
| | | +- org.codehaus.woodstox:wstx-asl:jar:3.2.0:compile
| | | - commons-httpclient:commons-httpclient:jar:3.0:compile
| | - org.codehaus.xfire:xfire-spring:jar:1.2.6:compile
| | +- org.apache.xbean:xbean-spring:jar:2.8:compile
| | - org.codehaus.xfire:xfire-xmlbeans:jar:1.2.6:compile
| | - xmlbeans:xbean:jar:2.2.0:compile
| +- commons-dbcp:commons-dbcp:jar:1.2.2:compile
| | - commons-pool:commons-pool:jar:1.3:compile
| +- org.directwebremoting:dwr:jar:2.0.1:compile
| +- javax.servlet:jstl:jar:1.1.2:compile
| +- taglibs:standard:jar:1.1.2:compile
| +- opensymphony:oscache:jar:2.3:compile
| +- opensymphony:sitemesh:jar:2.2.1:compile
| +- org.tuckey:urlrewritefilter:jar:3.0.4:compile
| - commons-lang:commons-lang:jar:2.4:compile
因此,我们需要确保这些可用。这可以通过更改WEB-INF/lib/*的packageExclude来实现,不排除所有内容,而是排除除我们想要保留的内容之外的所有内容。
这可以通过以下方式完成:
<packagingExcludes>
%regex[WEB-INF/lib/(?!clickstream|struts|appfuse|commons-fileupload|commons-dbcp|dwr|oscache|sitemesh|urlrewritefilter|commons-lang|velocity|xwork|commons-digester).*.jar]
</packagingExcludes>
这将使玻璃鱼不再抱怨找不到类。我还没到,所以可能需要再加一些罐子,但它越来越近了。