使用Maven在skinny WAR中包含特定的JAR文件

时间:2013-11-05 22:45:20

标签: maven jar war ear

我遇到了一些WAR模块的问题,以及加载taglib的困难。我一直得到这个例外:

JSPG0047E: Unable to locate tag library for uri http://www.springframework.org/tags/form 
    at com.ibm.ws.jsp.translator.visitor.tagfiledep.TagFileDependencyVisitor.visitCustomTagStart(TagFileDependencyVisitor.java:76)
    at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:366)
    at com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419)
    at com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369)
...

经过一番搜索后,我发现了很多关于弹簧罐需要在应用程序类路径上的建议。我查看了我的EAR的lib文件夹,果然,spring-web和spring-webmvc就在那里。

应该注意的是,EAR是使用瘦的WAR构建的 - 因为它们使用大多数相同的库,所有库文件都在MyAppEAR/lib而不是MyAppEAR/MyWAR1/WEB-INF/libMyAppEAR/MyWAR2/WEB-INF/lib,{ {1}}等等......

我终于设法解决了这个丢失的taglib错误,但我不得不将spring-web和spring-webmvc移动到MyAppEAR/MyWAR3/WEB-INF/lib

所以我有几个问题:

  1. 这是唯一的方法来解决此问题吗?
  2. 如果是这样,我如何使用maven构建一种瘦的WAR?目前,POM的EAR部分如下所示:

    MyAppEAR/MyWAR1/WEB-INF/lib
  3. 我想我可以关闭瘦的WAR然后再做一些步骤从WAR文件中删除所有库并将它们复制到MyAppEAR / lib 除了以用于弹簧网络罐子,但是我希望有一个更好的解决方案。

2 个答案:

答案 0 :(得分:0)

我想我已经开始工作了。

在WAR的POM文件中:

<plugin>
  <artifactId>maven-war-plugin</artifactId>
    <version>2.2</version>
    <configuration>
      <warSourceDirectory>src/main/webapp</warSourceDirectory>
      <packagingExcludes>WEB-INF/lib/*.jar,WEB-INF/*.xmi</packagingExcludes>
      <archive>
        <manifest>
             <addClasspath>true</addClasspath>
             <classpathPrefix>../../WEB-INF/lib/</classpathPrefix>
       </manifest>
      </archive>
    </configuration>
</plugin>

这会导致生成的WAR文件具有META-INF/MANIFEST.MF文件,其类路径条目看起来像../WEB-INF/lib/$someJarFile - 这是从WAR到EAR库文件夹的相对路径。我想WAR 需要来指定类路径,因为EAR中的库是不够的。

答案 1 :(得分:0)

我自己也有同样的问题 - 当我的Spring JAR文件位于我的ear/lib文件夹中时,我无法访问Spring或Sitemesh的TLD!

在MANIFEST中包含类路径导致我的app服务器变得混乱(因为所有依赖项都被加载了两次)。

(是的,我的skinnyWars也设置为maven-ear-plugin。)

我绕过这个问题的唯一方法是将Springsitemesh包括在maven-war-plugin的配置中:

<packagingExcludes>%regex[WEB-INF/lib/(?!spring|sitemesh).*.jar]</packagingExcludes>

不是最优雅的解决方案,但是我能找到的破坏性最小。

这是我的完整配置:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>

                <!--
                Q. Why is this set?
                A. maven-ear-plugin in our EAR modules have `skinnyWars` enabled to that WAR files 
                   would not include any third-party libraries in the WAR's WEB-INF/lib folder, however 
                   this does not work for ejbs (like our own EJB modules).

                   We'll need to exclude them from here anyway (except for a few select JARS)...
                -->                 
                <packagingExcludes>%regex[WEB-INF/lib/(?!spring|sitemesh).*.jar]</packagingExcludes>

                <archive>
                    <manifest>
                        <addClasspath>false</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

PS。我的设置是JBoss EAP 6.x和一个包含多个EJB,WAR和第三方JAR的ear文件。