我有一个配置了Maven的Web应用程序,它使用一个库,也使用Maven配置,当我打包geronimo-servlet_3.0_spec-1.0.jar包含在WEB-INF/lib中时,我不明白为什么。Maven:部署了javax.servlet规范
我请与MVN依赖库:树
$ mvn dependency:tree | grep geronimo
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_3.0_spec:jar:1.0:provided
检查我的web应用程序:
$ mvn dependency:tree | grep geronimo
$
当我运行mvn然而:软件包的文件被包含在WEB-INF/lib目录。
当我运行mvn tomcat的:来看,我可以看到:
信息:validateJarFile(/home/stivlo/workspace/private/src/main/webapp/WEB-INF/lib/geronimo-servlet_3.0_spec- 1.0.jar) - jar没有加载。请参阅Servlet规范2.3,第9.7.2节。违规类:javax/servlet/Servlet.class
为什么以及如何避免?谢谢。
UPDATE 1:作为请求的I添加的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.obliquid</groupId>
<artifactId>test-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>private webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<!-- For Jakarta ORO -->
<repository>
<id>mvnsearch</id>
<name>Maven Search</name>
<url>http://www.mvnsearch.org/maven2/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
<version>0.9-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>private</finalName>
</build>
</project>
UPDATE 2:我跟着斯蒂芬C的建议和修改的构建部分如下:
<build>
<finalName>private</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war</artifactId>
<version>2.1</version>
<configuration>
<overlays>
<overlay>
<groupId>org.obliquid</groupId>
<artifactId>test-webapp</artifactId>
<excludes>
<exclude>WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
</build>
但是geronimo * .jar仍然包含在内。我想我在这个配置中犯了一个错误。
更新3:斯蒂芬C.说我应该用
the groupId the artifactId of the WAR file that contains the JAR file(s) that you are trying to exclude.
我不知道WAR文件可以有一个groupId和artifactId的,其实在我的pom.xml我不看到任何。我的项目构建了一个WAR文件,并且有一个groupId和一个artifactId,这些都是我上面测试没有成功的那些。
的依赖造成的问题如下(是JAR,而不是一个WAR):
<dependency>
<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
<version>0.9-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
如果我尝试使用groupId和在这种依赖我有以下的错误中列出的artifactId:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project test-webapp: overlay [ id org.obliquid.helpers:obliquid-helpers] is not a dependency of the project. -> [Help 1]
如果我尝试使用groupId和由org.obliquid.helpers包括JAR中的artifactId:
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>)
我有同样的错误。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project test-webapp: overlay [ id org.apache.geronimo.specs:geronimo-servlet_3.0_spec] is not a dependency of the project. -> [Help 1]
阅读战争插件文档,我找到了关于creating skinny WARs的章节。所以我尝试了以下内容:
<build>
<finalName>private</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<packagingExcludes>WEB-INF/lib/geronimo-servlet_3.0_spec-1.0.jar</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>
仍然没有成功,geronimo-servlet_3.0_spec-1.0.jar仍然存在!
<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
[错误]未能执行目标org.apache.maven.plugins:Maven的战争插件:2.1.1:项目测试的webapp战争(默认战):覆盖[ID org.obliquid .helpers:obliquid-helpers]不是项目的依赖项。 - > [求助1]
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
[错误]未能执行目标org.apache.maven.plugins:Maven的战争插件:2.1.1:项目测试的webapp战争(默认战):覆盖[id org.apache.geronimo.specs:geronimo-servlet_3.0_spec]不是项目的依赖项。 - > [Help 1]
UPDATE 4:我发现target/private.war文件不是target/private /目录的zip文件,但排除是在打包时完成的,而不是通过删除文件目标/私人/ - 这意味着,我必须重新测试我之前做过的所有事情。
- gouki建议:不起作用,JAR仍然存在于WAR文件中。
- Stephen C.的建议,可能是误解:实际上我只是注意到,pom.xml总是无效的,无论我在上面解释了三种可能性的groupId/artifactId。所以他们没有为我工作。
- 我在文档(packagingExcludes)中找到的作品。
现在,如果我不得不选择他的答案之一,我会选择Stephen C.,因为他帮助我指出WAR插件的文档(我在错误的地方阅读)。不过,我会接受一个不起作用的答案,至少在我尝试的方式(可能是错误的)方面。所以我不打算接受任何答案,并自己添加一个新的答案与最终的工作配置。
UPDATE 5:我发布了obliquid-helpers的pom.xml的相关部分,它提到了geronimo-servlet_3.0_spec。我已经标记了它是可选的,并且提供了作用域,但它仍然包含在web应用中,除非我在maven-war-plugin配置中将其标记为“packagingExclude”。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
<version>0.9-SNAPSHOT</version>
<packaging>jar</packaging>
<name>obliquid-helpers</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
[...]
</repositories>
<dependencies>
[...]
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
你能包括你的pom吗? – gouki
当然,我将它添加到答案中。 – stivlo