簡體   English   中英

Maven:已部署javax.servlet規范

[英]Maven: javax.servlet specification deployed

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

為什么以及如何避免? 謝謝。

更新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 :斯蒂芬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]

更新4 :我發現target / private.war文件不是target / private /目錄的zip文件,但是排除是在打包時完成的,而不是通過刪除target / private /中的文件進行的-這意味着,我已經重新測試我之前所做的所有事情。

  • gouki的建議:不起作用,WAR文件中也仍然存在JAR。
  • 斯蒂芬·C(Stephen C.)的建議,可能會被誤解:實際上,我只是注意到,不管我把上面解釋的三種可能性的groupId / artifactId用作什么,pom.xml始終是無效的。 所以他們沒有為我工作。
  • 我在文檔(packagingExcludes)中找到的內容有效。

現在,如果我必須選擇他的答案之一,我會選擇Stephen C.,因為他幫助我指出了WAR插件的文檔(我在錯誤的地方閱讀)。 但是,我會接受一個無效的答案,至少在我嘗試過的方式上(可能是錯誤的)。 因此,我不會接受任何答案,而是自己使用最終的工作配置添加新的答案。

更新5 :我張貼了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>

顯然,某些內容與該JAR文件有關。 如果它沒有顯示在依賴關系樹中,則可能是由於您的webapp WAR文件對另一個具有此依賴關系的WAR文件的依賴所致。

如果是這種情況,那么您可以在WAR文件插件的構建描述符的<overlay>元素中添加<excludes> 例如

...
<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文件可能仍然會徘徊。

根據您的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>

首先,我要感謝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中排除

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM