Maven-Abhängigkeit für Servlet 3.0-API?

229

Wie kann ich Maven 2 anweisen, die Servlet 3.0-API zu laden?

Ich habe es versucht:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>3.0</version>
    <scope>provided</scope>
</dependency>

Ich verwende http://repository.jboss.com/maven2/, aber welches Repository wäre korrekt?

Nachtrag:

Es funktioniert mit einer Abhängigkeit für die gesamte Java EE 6-API und den folgenden Einstellungen:

<repository>
    <id>java.net</id>
    <url>http://download.java.net/maven/2</url>
</repository>

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>

Ich würde es vorziehen, nur die Servlet-API als Abhängigkeit hinzuzufügen, aber "Brabster" hat möglicherweise Recht, dass separate Abhängigkeiten durch Java EE 6-Profile ersetzt wurden. Gibt es eine Quelle, die diese Annahme bestätigt?

Deamon
quelle
84
Keine Quellen, keine Javadocs im Repository von java.net/maven/2. Oracle, fahr zur Hölle!
stepancheg
2
Wenn Sie Javaee-Api anstelle von Servlet-API verwenden, erhalten Sie nicht dieselbe Version von javax.servlet.ServletContext. Ich verwende Spring Framework 3.1 und Dynamic Dispathcer (Annotation). Sa'ads Antwort ist die einzige Antwort, die für mich funktioniert. Sie sollten wirklich nicht mit Pascal gehen, da dies allgemeiner zu sein scheint. Heck .. Gradle schlägt Maven bei der Auflösung von Abhängigkeiten.
Mukus
OMG, sie haben den Artefaktnamen von servlet-apiin geändert javax.servlet-api. Verlor eine halbe Stunde "Debugging" ...: /
insan-e

Antworten:

116

Ich würde es vorziehen, nur die Servlet-API als Abhängigkeit hinzuzufügen.

Um ehrlich zu sein, ich bin mir nicht sicher warum, aber egal ...

Separate Brabster- Abhängigkeiten wurden durch Java EE 6-Profile ersetzt. Gibt es eine Quelle, die diese Annahme bestätigt?

Das Maven-Repository von Java.net bietet tatsächlich das folgende Artefakt für das WebProfile:

<repositories>
  <repository>
    <id>java.net2</id>
    <name>Repository hosting the jee6 artifacts</name>
    <url>http://download.java.net/maven/2</url>
  </repository>
</repositories>        
<dependencies>
  <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

Dieses Glas enthält Servlet 3.0, EJB Lite 3.1, JPA 2.0, JSP 2.2, EL 1.2, JSTL 1.2, JSF 2.0, JTA 1.1, JSR-45, JSR-250.

Meines Wissens kann jedoch nichts darüber aussagen, dass diese APIs nicht separat verteilt werden (im java.net-Repository oder anderswo). Zum Beispiel (ok, es kann ein besonderer Fall sein) ist die JSF 2.0-API separat verfügbar (im java.net-Repository):

<dependency>
   <groupId>com.sun.faces</groupId>
   <artifactId>jsf-api</artifactId>
   <version>2.0.0-b10</version>
   <scope>provided</scope>
</dependency>

Und tatsächlich könnten Sie javax.servlet-3.0.jarvon dort kommen und es in Ihrem eigenen Repository installieren.

Pascal Thivent
quelle
3
Eine kleine Korrektur: Javaee-Web-API enthält EL 2.2 (Unified Expression Language 2.2), nicht EL 1.2
Andrey
1
... und für gradle verwenden: kompilieren Sie 'javax: javaee-web-api: 6.0'
Robert Christian
1
Beachten Sie, dass javaee-web-apinur Methodenstubs (kein Bytecode) enthalten sind. Sie können diese Abhängigkeit nicht außerhalb des providedGeltungsbereichs verwenden, weshalb ich den Vorschlag von Sa'ad bevorzuge.
Rafael Winterhalter
2
@Pascal - "Ich würde es vorziehen, nur die Servlet-API als Abhängigkeit hinzuzufügen" - Sie würden dies tun, wenn Sie es mit einem reinen Servlet-Container (Tomcat, Jetty) oder einem JEE-kompatiblen Container (TomEE, Wildfly usw.) zu tun haben
YoYo
1
Die Javaee-Web-API wurde aktualisiert auf<version>7.0</version>
OJVM
461

Dies scheint vor kurzem hinzugefügt worden zu sein:

http://repo1.maven.org/maven2/javax/servlet/javax.servlet-api/3.0.1/

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
</dependency>
Sa'ad
quelle
29
Sie sollten <scope> zur Verfügung gestellt </ scope>
Serkan Arıkuşu
1
Hey, das funktioniert gut, aber ich bin mir nicht sicher, ob dies die genaue zu verwendende Abhängigkeit ist (zum Beispiel mit Tomcat 7). Der Grund dafür ist, dass die mit dieser Abhängigkeit verbundenen Quellen nicht mit dem übereinstimmen, was tatsächlich ausgeführt wird, wenn Sie tatsächlich debuggen.
Eugen
5
@TejaswiRana Vorausgesetzt, der Umfang bedeutet, dass es nicht für den Krieg verpackt ist. Die Abhängigkeit ist zur Kompilierungszeit verfügbar. Sie erwarten sie im Ordner der Serverbibliothek.
BanterCZ
5
Warum wurde die Artefakt-ID nicht einfach wiederverwendet servlet-api? Weil es Spaß macht, <excludes>die alte Artefakt -ID hinzuzufügen (um zu verhindern, dass sowohl die alte als auch die neue Servlet-API in Ihren Klassenpfad aufgenommen werden, wenn eine Ihrer Abhängigkeiten immer noch von der alten abhängt)? :)
Geoffrey De Smet
3
Zu Ihrer Information, die neueste Version ist javax.servlet-api-3.1.0. Stellen Sie nur sicher, dass Ihr Servlet-Container diese Version verarbeiten kann. Zum Beispiel kann Version 8 von Tomcat 3.1 verarbeiten .
Basil Bourque
25

Hier ist was ich benutze. Alle diese sind in der Zentrale und haben Quellen.

Für Tomcat 7 (Java 7, Servlet 3.0)

Hinweis - Servlet-, JSP- und EL-APIs werden in Tomcat bereitgestellt. Nur JSTL (falls verwendet) muss mit der Web-App gebündelt werden.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>2.2.4</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Für Tomcat 8 (Java 8, Servlet 3.1)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
Rustyx
quelle
Dies funktioniert, aber die vorgeschriebenen Abhängigkeiten befinden sich im Abschnitt Maven, werden jedoch nie in die WAR-Datei aufgenommen, da sie als "bereitgestellt" gekennzeichnet sind. ABER ... Ich kann das Projekt niemals dazu bringen, die JARs im Tomcat lib-Verzeichnis zu verwenden, obwohl ich dieses Tomcat lib-Verzeichnis in den Eclipse-Erstellungspfad aufgenommen habe und sie dort deutlich zu sehen sind. Meine pom.xml kann diese Tomcat-JARs niemals auflösen und erfordert immer die Version 3.0.1 der Servlet-API-JAR aus dem lokalen Maven-Repo anstelle der von Tomcat bereitgestellten Version 3.0. Ich habe keine Ahnung warum das ist ... kann jemand erklären?
Geeb
Können Sie angeben, welche Version von <groupId> javax.servlet </ groupId> <artifactId> javax.servlet-api </ifactId> ich für Tomcat 8.5 verwenden kann?
Gog1nA
24

Wenn Sie das Javaee- (Web-) API als Abhängigkeit hinzufügen, erhalten Sie leider nicht das Javadoc oder die Quelle zur Servlet-API, um sie in der IDE zu durchsuchen. Dies gilt auch für alle anderen Abhängigkeiten (JPA, EJB, ...). Wenn Sie die Servlet-API-Quellen / javadoc benötigen, können Sie Ihrer pom.xml Folgendes hinzufügen (funktioniert zumindest für JBoss & Glassfish):

Repository:

<repository>
  <id>jboss-public-repository-group</id>
  <name>JBoss Public Repository Group</name>
  <url>https://repository.jboss.org/nexus/content/groups/public/</url>
</repository>

Abhängigkeit:

<!-- Servlet 3.0 Api Specification -->
<dependency>
   <groupId>org.jboss.spec.javax.servlet</groupId>
   <artifactId>jboss-servlet-api_3.0_spec</artifactId>
   <version>1.0.0.Beta2</version>
   <scope>provided</scope>
</dependency>

Ich habe die Javaee-API vollständig aus meinen Abhängigkeiten entfernt und durch die diskreten Teile (javax.ejb, javax.faces, ...) ersetzt, um die Quellen und Javadocs für alle Teile von Java EE 6 abzurufen.

BEARBEITEN:

Hier ist die entsprechende Glassfish-Abhängigkeit (obwohl beide Abhängigkeiten funktionieren sollten, unabhängig davon, welchen Appserver Sie verwenden).

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.servlet</artifactId>
  <version>3.0</version>
  <scope>provided</scope>
</dependency>
Ingo Fischer
quelle
1
Warum müssen wir die Version angeben 1.0.0.Beta2, wenn 3.0wir diese Version benötigen? Das macht es komplex.
Geoffrey De Smet
9

Das Apache Geronimo-Projekt bietet eine Servlet 3.0-API-Abhängigkeit vom Maven Central-Repo:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-servlet_3.0_spec</artifactId>
    <version>1.0</version>
</dependency>
Patrick Crocker
quelle
2
Das funktioniert und scheint der einfachste Weg zu sein, danke! Übrigens hat Apache Geronimo noch viel mehr zu bieten: mvnrepository.com/artifact/org.apache.geronimo.specs
stivlo
5

Nur für Neulinge.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
Sergii I.
quelle
4

Ich habe ab September ein Beispiel-POM für die Servlet 3.0-API auf DZone gefunden .

Schlagen Sie vor, das Repo java.net unter http://download.java.net/maven/2/ zu verwenden.

Es gibt dort Java EE-APIs, zum Beispiel http://download.java.net/maven/2/javax/javaee-web-api/6.0/ mit POM, die so aussehen, als wären sie das, wonach Sie suchen ::

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-web-api</artifactId>
  <version>6.0</version>
</dependency>

Ich vermute, dass die Versionskonventionen für die APIs geändert wurden, um der Version der gesamten EE-Spezifikation (dh Java EE 6 vs. Servlets 3.0) als Teil der neuen 'Profile' zu entsprechen. Wenn man in die JAR schaut, sieht es so aus, als ob das ganze 3.0-Servlet-Zeug da drin ist. Genießen!

Brabster
quelle
Danke, es funktioniert! Die einzige verbleibende Frage ist, ob Java EE 6-Profile separate Bibliotheken ersetzt haben. (siehe
Anhang
Wenn Sie davon abhängig sind, können Sie keinen tragbaren Krieg führen (einen, der auf JBoss, Tomcat, Jetty, ... funktioniert), da Sie für Tomcat / Jetty einen Teil dieser bereitgestellten Abhängigkeit (Servlet) und setzen müssen ein teil davon nicht vorgesehen (cdi), was unmöglich ist.
Geoffrey De Smet
3

Eine bequeme Möglichkeit (JBoss empfohlen), Java EE 6-Abhängigkeiten einzuschließen, wird unten gezeigt. Infolgedessen werden Abhängigkeiten separat platziert (nicht alle in einem Glas wie in javaee-web-api), Quelldateien und Javadocs der Bibliotheken können aus dem Maven-Repository heruntergeladen werden.

<properties>
    <jboss.javaee6.spec.version>2.0.0.Final</jboss.javaee6.spec.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-web-6.0</artifactId>
        <version>${jboss.javaee6.spec.version}</version>
        <scope>provided</scope>
        <type>pom</type>
    </dependency>
</dependencies>

Um nur einzelne Abhängigkeiten einzuschließen, können dependencyManagementAbschnitt und Bereich importverwendet werden:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.spec</groupId>
                <artifactId>jboss-javaee6-specs-bom</artifactId>
                <version>${jboss.javaee6.spec.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- No need specifying version and scope. It is defaulted to version and scope from Bill of Materials (bom) imported pom. -->
        <dependency>
            <groupId>org.jboss.spec.javax.servlet</groupId>
            <artifactId>jboss-servlet-api_3.0_spec</artifactId>
        </dependency>
    </dependencies>
Andrey
quelle
-3

Versuchen Sie diesen Code ...

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>
Josh
quelle
Abhängigkeiten im Alpha-Stadium sind nicht immer für Produktionsanwendungen geeignet.
Stephan