2016-03-26 9 views
2

Ich erstelle eine Webanwendung mit Maven, und ich habe ein Problem - aus irgendeinem Grund bekomme ich servlet-api-2.5.jar enthalten, die seltsame Ausnahmen gibt. Das Entfernen dieser Datei aus dem WAR-Archiv löst alle Probleme, aber ich versuche zu verstehen, warum es in erster Linie dort ist. Meine Abhängigkeiten in der vollständige pom.xml Datei ist:Maven: Warum bekomme ich servlet-api-2.5

<?xml version="1.0" encoding="UTF-8"?> 
<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.sillyfly.webapp</groupId> 
    <artifactId>Webapp</artifactId> 
    <version>0.1</version> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>7</source> 
        <target>7</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <webXml>web/WEB-INF/web.xml</webXml> 
        <webappDirectory>web</webappDirectory> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.json</artifactId> 
      <version>1.0.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.taglibs</groupId> 
      <artifactId>taglibs-standard-impl</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.taglibs</groupId> 
      <artifactId>taglibs-standard-jstlel</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.taglibs</groupId> 
      <artifactId>taglibs-standard-spec</artifactId> 
      <version>1.2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.38</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
</project> 

Und läuft mvn dependency:tree -Dverbose ergibt:

[INFO] Scanning for projects... 
[INFO] Searching repository for plugin with prefix: 'dependency'. 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Unnamed - org.sillyfly.webapp:Webapp:jar:0.1 
[INFO] task-segment: [dependency:tree] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [dependency:tree {execution: default-cli}] 
[INFO] org.sillyfly.webapp:Webapp:jar:0.1 
[INFO] +- org.glassfish:javax.json:jar:1.0.4:compile 
[INFO] +- org.apache.taglibs:taglibs-standard-impl:jar:1.2.5:compile 
[INFO] +- org.apache.taglibs:taglibs-standard-jstlel:jar:1.2.5:compile 
[INFO] +- org.apache.taglibs:taglibs-standard-spec:jar:1.2.5:compile 
[INFO] +- mysql:mysql-connector-java:jar:5.1.38:compile 
[INFO] \- javax.servlet:javax.servlet-api:jar:3.1.0:compile 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 2 seconds 
[INFO] Finished at: Sat Mar 26 12:12:32 IDT 2016 
[INFO] Final Memory: 24M/515M 
[INFO] ------------------------------------------------------------------------ 

Wo gibt es keine Erwähnung für servlet-api-2.5.jar. Ich merke jetzt, es sagt jar und nicht war, also meine Frage ist zweifach: 1. Sind die JAR und WAR Abhängigkeiten unterschiedlich, und wenn ja wie bekomme ich Maven Abhängigkeits-Plugin, um mir die WAR-Abhängigkeiten zu zeigen? 2. Wie kann ich Maven und nicht explizit mitteilen, dass servlet-api-2.5.jar eingeschlossen werden soll? Ich habe versucht, an verschiedenen Stellen einen Ausschluss hinzuzufügen, aber da ich nicht weiß, warum es überhaupt da ist, ist es meistens ein Ratespiel, wo man den Ausschluss setzen kann, und keiner der Orte, die ich ausprobiert habe, hat funktioniert.

mvn --version für referene:

Apache Maven 2.2.1 (rdebian-23) 
Java version: 1.8.0_72-internal 
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre 
Default locale: en_US, platform encoding: UTF-8 
OS name: "linux" version: "4.4.0-1-amd64" arch: "amd64" Family: "unix" 

Edit: ich Maven aktualisiert 3.3.9 und ich immer noch genau das gleiche Ergebnis erhalten. Der einzige Unterschied besteht darin, dass der Abhängigkeitsbaum Abhängigkeiten zwischen den verschiedenen Apache-Taglibs-Bibliotheken zeigt, aber immer noch keine Erwähnung von servlet-api-2.5.

+0

Haben Sie auf Ihre javax.servlet Abhängigkeit zur Verfügung gestellt zu setzen versucht? Übrigens ist das Artefakt nicht Servlet-Api? –

+0

Wenn Sie es an erster Stelle bekommen, warum haben Sie es von der Sekunde entfernt? –

+0

Nein, es ist [javax.servlet-api] (http://search.maven.org/#artifactdetails%7Cjavax.servlet%7Cjavax.servlet-api%7C3.1.0%7Cjar). Wenn sie auf "bereitgestellt" gesetzt wird, ändert sich der resultierende Krieg nicht. Nur um klar zu sein - ich bekomme sowohl 2,5 * als auch * 3,1 im Krieg, nicht nur 2,5. Es ist nur, dass 2.5 falsch ist und Laufzeitausnahmen verursacht. – Itai

Antwort

2

Ich kann Ihr Problem nicht anhand der Informationen reproduzieren, die Sie angegeben haben, daher muss die Ursache woanders liegen.

Wird in der Befehlszeile die zusätzliche JAR-Datei für Servlets angezeigt, wenn mvn package ausgeführt wird, oder könnte dies ein seltsamer Effekt Ihrer IDE sein?

Wenn das Problem weiterhin besteht, versuchen Sie, Ihre App auf ein Minimum zu reduzieren und ein eigenständiges Projekt zu erstellen, z. auf GitHub, dass die Leute sehen können.

Übrigens, Sie dürfen die Servlet-API niemals in WEB-INF/lib einfügen (nicht zweimal und nicht einmal). Verwenden Sie immer den Maven-Gültigkeitsbereich provided für die Servlet-API.

+0

Aus irgendeinem Grund, sowohl 'servlet-api-2.5.jar' * als auch *' javax.servlet- api-3.1.0.jar 'endet in 'WEB-INF/lib', auch wenn ich letzteres' vorausgesetzt 'gebe. Ich aktualisiere die Frage, um die vollständige 'pom.xml' zu enthalten. Gibt es noch etwas, das Maven beeinflussen kann? Das Projekt stammt ursprünglich von Intellij, aber ich glaube, Maven kümmert sich nur darum, was in der 'pom.xml' steckt, richtig? – Itai

+0

Ich führe 'mvn war: war' von der Kommandozeile aus. Das Ausführen von 'mvn package' erzeugt eine JAR, nicht eine WAR, und diese JAR enthält keinerlei Bibliotheken. – Itai

+0

@sillyfly mit 'mvn war: war' mit Ihrem Pom puts libs javax.json-1.0.4.jar, mysql-connector-java-5.1.38.jar, taglibs-standard-impl-1.2.5.jar , taglibs-standard-jstlel-1.2.5.jar, taglibs-standard-spec-1.2.5.jar im lib-Ordner. Nichts anderes. Etwas anderes muss hier geschehen. – eis

1

Der Schuldige war lib/ und classes/ Ordner in der Quelle WEB-INF, die die Gläser enthielt, die enthalten wurden. Die Ordner wurden aufgrund einer fehlerhaften Pom-Konfiguration erstellt (siehe unten). Die Situation war nach dem Aktivieren der Maven-Debug-Ausgabe (mvn -X) beim Ausführen von Maven sichtbar.

Das Entfernen dieser Ordner löste alle meine Probleme.

bearbeiten: wieder die gleichen Ordner Nachdem ich, fand ich die Wurzel der Ursache - ich <webappDirectory> verwendet haben, wenn ich <warSourceDirectory> verwendet haben sollte.

1

Normalerweise gibt es in Ihrem Projekt eine Abhängigkeit, die von servlet-apî.jar abhängt.
Das Standardverhalten von Maven ist, dass ich versuche, Ihre Abhängigkeit + die Abhängigkeiten der importierten Abhängigkeit zu importieren. Wenn Sie einen bestimmten „Unter Abhängigkeit“ ausschließen möchten, können Sie Maven eine Konfiguration wie folgt geben:

<dependency> 
    <groupId>com.hpsworldwide.mbtrs.switch</groupId> 
    <artifactId>DEPENDENCY</artifactId> 
    <version>1.0</version> 
    <exclusions> 
     <exclusion> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency>