3

我在使用 WAR 模块时遇到了一些问题,并且在加载 taglib 时遇到了困难。我不断收到此异常:

JSPG0047E: 找不到 uri http://www.springframework.org/tags/form 的标记库
    在 com.ibm.ws.jsp.translator.visitor.tagfiledep.TagFileDependencyVisitor.visitCustomTagStart(TagFileDependencyVisitor.java:76)
    在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:366)
    在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processChildren(JspVisitor.java:419)
    在 com.ibm.ws.jsp.translator.visitor.JspVisitor.processJspElement(JspVisitor.java:369)
...

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

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

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

所以我有几个问题:

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

    <plugin>
      <artifactId>maven-ear-plugin</artifactId>
      <version>2.8</version>
      <configuration>
        <applicationName>MyAppEAR</applicationName>
        <defaultLibBundleDir>lib</defaultLibBundleDir>
        <skinnyWars>true</skinnyWars>
    

我想我可以关闭瘦 WAR,然后有一些其他步骤从 WAR 文件中删除所有库,并将它们复制到 MyAppEAR/lib ,除了spring web jar,但我希望有更好的解决方案。

4

2 回答 2

1

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

在 MANIFEST 中包含类路径导致我的应用服务器出现问题(因为所有依赖项都被加载了两次)。

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

我可以解决这个问题的唯一方法是在's 配置中包含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 文件。

于 2015-05-05T20:45:05.987 回答
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 中拥有库是不够的。

于 2013-11-06T18:59:50.140 回答