与 war 路径的 Maven 瘦 war

xiaohuochai 阅读:21 2024-11-01 17:39:52 评论:0

我有一个项目,其中 3 个 war-modules 被打包在一个 ear-module 中。我的问题是每个库 jar 都包含在每个 war 模块以及 ear 模块中,这使得生成的 ear 文件非常大(目前大约 190MB)。

我在这里遵循了使用 Maven 进行瘦身 war 的教程:http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

有了这个,我设法将耳朵的大小降低到 45MB 左右,这很好,但是当我尝试部署到 glassfish 时,它提示缺少一些类。

我发现这是由于对打包为 war 文件的 appfuse-struts 的依赖。这包括在其中一个 war 项目中使用 war 路径依赖项。

因为关于制作瘦身 war 的教程指出, war 中发现的所有依赖项也必须在耳朵中定义。我试过这个,但是 appfuse-struts 依赖是一个 war 路径使得它不起作用。 (当只向 ear pom 添加 war 依赖时,它会提示它没有找到一些类,而当添加 warpath 依赖时,maven 会提示它不知道 warpath 是什么。)

当 war 使用 warpath 依赖时,有谁知道用瘦 war 创建耳朵的方法吗?

请您参考如下方法:

我想我可能找到了解决方案:

在瘦身 war 教程中,应该将 WEB-INF/lib/*.jar 添加到 packagingExcludes 中。然后,将所有依赖项添加到 ear-configuration 中,使其可用于 jars。

问题在于,war-packaged 依赖项不会将其传递依赖项添加到 ear 的 lib 文件夹中,因此它们要么需要找到进入 ear lib 文件夹的方式,要么需要进入 ear 的 WEB-INF/lib 文件夹 war 包。

我选择了最后一个,将它们添加到 war 文件的 WEB-INF/lib 中。

为此,首先通过执行 mvn dependency:tree 获取包含 war/warpath 资源的 war 项目的依赖关系树。

接下来,找到 warpath 依赖项。就我而言,它看起来像这样:

      +- 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/* 的 packagingExclude 更改为不排除所有内容,而是排除除我们想要保留的内容之外的所有内容来完成。

这可以通过以下方式完成:

      <packagingExcludes> 
       %regex[WEB-INF/lib/(?!clickstream|struts|appfuse|commons-fileupload|commons-dbcp|dwr|oscache|sitemesh|urlrewritefilter|commons-lang|velocity|xwork|commons-digester).*.jar] 
      </packagingExcludes> 

这将使 glassfish 停止提示找不到类。我还没有到那一步,所以可能需要包含更多的 jar ,但它越来越近了。


标签:Maven
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号