我有一個配置了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