我遇到了一些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/lib
,MyAppEAR/MyWAR2/WEB-INF/lib
,{ {1}}等等......
我终于设法解决了这个丢失的taglib错误,但我不得不将spring-web和spring-webmvc移动到MyAppEAR/MyWAR3/WEB-INF/lib
。
所以我有几个问题:
如果是这样,我如何使用maven构建一种瘦的WAR?目前,POM的EAR部分如下所示:
MyAppEAR/MyWAR1/WEB-INF/lib
我想我可以关闭瘦的WAR然后再做一些步骤从WAR文件中删除所有库并将它们复制到MyAppEAR / lib 除了以用于弹簧网络罐子,但是我希望有一个更好的解决方案。
答案 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
。)
我绕过这个问题的唯一方法是将Spring
和sitemesh
包括在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文件。