Maven:已部署javax.servlet规范

我有一个配置了Maven的Web应用程序,该应用程序使用了一个库,也配置了Maven,并且当我将geronimo-

servlet_3.0_spec-1.0.jar包包含在WEB-INF / lib中时,我不明白为什么。

我检查与mvn依赖库:树

$ 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:run时,我可以看到:

INFO:validateJarFile(/home/stivlo/workspace/private/src/main/webapp/WEB-

INF/lib/geronimo-servlet_3.0_spec-1.0.jar)-未加载jar。参见Servlet Spec

2.3,第9.7.2节。令人反感的类:javax / servlet / Servlet.class

为什么以及如何避免?谢谢。

:根据要求,我添加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>

:我遵循了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仍然包含在内。我想我在此配置中犯了一个错误。

:斯蒂芬C.说我应该使用

groupId包含要尝试排除的JAR文件的WAR文件的artifactId。

我不知道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,则会出现以下错误:

[错误]无法在项目test-webapp上执行目标org.apache.maven.plugins:maven-war-

plugin:2.1.1:war(默认战争):覆盖[id org.obliquid.helpers:obliquid-

helpers]不是项目的依赖项。-> [帮助1]

如果我尝试使用org.obliquid.helpers包含的JAR的groupId和artifactId:

<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(默认为war):覆盖[id org.apache.geronimo.specs:geronimo-

servlet_3.0_spec]不是项目的依赖项。-> [帮助1]

阅读War插件文档,我找到了有关创建瘦WAR的部分。所以我尝试了以下方法:

<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(默认战争):覆盖[id org.obliquid.helpers:obliquid-helpers]不是项目的依赖项。->

[帮助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(默认为war):覆盖[id org.apache.geronimo.specs:geronimo-

servlet_3.0_spec]不是项目的依赖项。-> [帮助1]

:我发现target / private.war文件不是target / private

/目录的zip文件,但是排除是在打包时完成的,而不是通过删除target / private /中的文件进行的-

这意味着,我已经重新测试我之前所做的所有事情。

  • gouki的建议:不起作用,WAR文件中也仍然存在JAR。
  • 斯蒂芬·C(Stephen C.)的建议,可能会被误解:实际上,我只是注意到,不管我把上面解释的三种可能性的groupId / artifactId设置为什么,pom.xml始终无效。所以他们没有为我工作。
  • 我在文档(packagingExcludes)中找到的内容有效。

现在,如果我必须选择他的答案之一,我会选择Stephen

C.,因为他帮助我指出了WAR插件的文档(我在错误的地方阅读)。但是,我会接受一个无效的答案,至少在我尝试过的方式上(可能是错误的)。因此,我不会接受任何答案,而是自己使用最终的工作配置添加新的答案。

:我张贴了obliquid-helpers的pom.xml的相关部分,其中提到geronimo-

servlet_3.0_spec。我已将其标记为可选并提供了范围,但除非在maven-war-plugin配置中将其标记为“

packagingExclude”,否则它仍将包含在Web应用程序中。

<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>

回答:

首先,我要感谢gouki和Stephen

C.的帮助。但是他们提出的解决方案对我不起作用。我感谢他们,但我不能接受他们的回答,因为它不能解决此问题,因此会产生误导。我赞成Stephen

C.的答案,因为他为我指出了正确的文档,这对于解决问题至关重要。

阅读WAR插件文档,特别是war:war mojo部分,我找到了一个有关如何创建Skinny

WAR的示例,该示例可以解决问题。因此,这是在工作配置下面,要添加到构建部分中:

<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中排除

以上是 Maven:已部署javax.servlet规范 的全部内容, 来源链接: utcz.com/qa/400095.html

回到顶部