我有一个配置了Maven的Web应用程序,它使用了一个库,也配置了Maven,当我打包geronimo-servlet_3.0_spec-1.0.jar包含在WEB-INF / lib中时我不明白为什么。
我用mvn依赖检查库:tree
$ mvn dependency:tree | grep geronimo
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_3.0_spec:jar:1.0:provided
我查看了我的网络应用:
$ mvn dependency:tree | grep geronimo
$
但是当我运行mvn:package时,文件包含在WEB-INF / lib中。
当我运行mvn tomcat时:运行我可以看到:
INFO: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
为什么以及如何避免?谢谢。
更新1 :根据要求添加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>
更新2 :我按照Stephen 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 :Stephen C.说我应该使用
groupId WAR的artifactId 包含JAR文件的文件 您试图排除。
我不知道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,则会出现以下错误:
[错误]无法执行目标 org.apache.maven.plugins:Maven的战争插件:2.1.1:战争 项目test-webapp上的(default-war): 叠加[id org.obliquid.helpers:obliquid-助手] 不是项目的依赖项。 - &GT; [帮助1]
如果我尝试使用org.obliquid.helpers包含的JAR的groupId和artifactId:
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>)
我有同样的错误。
[错误]无法执行目标 org.apache.maven.plugins:Maven的战争插件:2.1.1:战争 项目test-webapp上的(default-war): 叠加[id org.apache.geronimo.specs:Geronimo的servlet_3.0_spec] 不是项目的依赖项。 - &GT; [帮助1]
阅读War插件文档,我找到了一个关于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>
[错误]无法在项目test-webapp上执行目标org.apache.maven.plugins:maven-war-plugin:2.1.1:war(default-war):overlay [id org.obliquid.helpers:obliquid -helpers]不是项目的依赖项。 - &GT; [帮助1]
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
[错误]无法在项目test-webapp上执行目标org.apache.maven.plugins:maven-war-plugin:2.1.1:war(default-war):overlay [id org.apache.geronimo.specs :geronimo-servlet_3.0_spec]不是项目的依赖项。 - &GT; [帮助1]
更新4 :我发现target / private.war文件不是target / private /目录的zip,但排除是在打包时完成的,而不是删除target /中的文件私人/ - 这意味着,我要重新测试我以前做过的所有事情。
现在,如果我必须选择其中一个答案,我会选择Stephen C.,因为他帮助我指向WAR插件的文档(我在错误的地方阅读)。但是,我接受一个不起作用的答案,至少在我尝试的方式(可能是错误的)。所以我不会接受任何答案,并在最后的工作配置中添加一个新答案。
更新5 :我发布了obliquid-helpers的pom.xml的相关部分,提到了geronimo-servlet_3.0_spec。我已经将它标记为可选,并且提供了范围,但仍然包含在web-app中,除非我在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>
答案 0 :(得分:1)
显然,某些东西依赖于该JAR文件。如果它没有显示在依赖关系树中,可能是由于您的webapp WAR文件依赖于具有此依赖关系的另一个WAR文件。
如果是这种情况,那么您可以将<excludes>
添加到WAR文件插件的构建描述符的<overlay>
元素中; e.g。
...
<build>
<finalName>webapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<overlays>
<overlay>
<groupId>xxx</groupId>
<artifactId>yyy</artifactId>
<excludes>
<exclude>WEB-INF/lib/whatever.jar</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
</plugins>
</build>
...
如果您使用的是WAR文件覆盖,则应始终在构建中包含clean
目标。否则,您可以在WAR文件中隐藏旧的依赖项。 (IIRC,每次在没有清洁的情况下构建重叠的WAR时,Maven输出中都会出现警告!)
事实上,这可能是您遇到问题的根本原因。例如,如果之前您将“geronimo”作为普通依赖项,并且从那时起您还没有运行mvn clean
,那么JAR文件仍然可以处于闲置状态。
答案 1 :(得分:0)
根据您的pom.xml,唯一可能依赖于geronimo servlet的依赖项是
<dependency>
<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
<version>0.9-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
您可以尝试在此依赖项中排除geronimo吗?
<dependency>
<groupId>org.obliquid.helpers</groupId>
<artifactId>obliquid-helpers</artifactId>
<version>0.9-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
</exclusion>
</exclusions>
</dependency>
答案 2 :(得分:0)
首先,我要感谢gouki和Stephen C.帮助我。然而他们提出的解决方案并不适用于我。我很感激他们,但是我不能接受他们的回答,因为这会产生误导,因为它对这个问题不起作用。我赞成Stephen C.回答,因为他向我指出了正确的文档,这对解决问题至关重要。
阅读WAR插件文档,特别是war:war mojo部分,我找到了一个关于如何创建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>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
可能并不真正需要存档部分,但我会在部署WAR时发现。实现这一技巧的部分是packagingExcludes标记,它可以包含一个逗号分隔的标记列表,以便在打包之前从WAR中排除。