Dépendance Maven pour l'API Servlet 3.0?

229

Comment dire à Maven 2 de charger l'API Servlet 3.0?

J'ai essayé:

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

J'utilise http://repository.jboss.com/maven2/ mais quel référentiel serait correct?

Addenda:

Il fonctionne avec une dépendance pour l'ensemble de l'API Java EE 6 et les paramètres suivants:

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

Je préfère ajouter uniquement l'API Servlet en tant que dépendance, mais "Brabster" a peut-être raison de dire que des dépendances distinctes ont été remplacées par des profils Java EE 6. Y a-t-il une source qui confirme cette hypothèse?

démon
la source
84
Pas de sources, pas de javadocs dans le référentiel java.net/maven/2. Oracle, allez en enfer!
stepancheg
2
L'utilisation de javaee-Api au lieu de servlet-api ne vous donne pas la même version de javax.servlet.ServletContext. J'utilise Spring Framework 3.1 et j'utilise le dispathcer dynamique (annotation). La réponse de Sa'ad est la seule réponse qui fonctionne pour moi. Vous ne devriez vraiment pas aller avec Pascal car cela semble être plus générique. Heck .. gradle bat maven dans la résolution des dépendances.
Mukus
OMG, ils ont changé le nom de l' artefact de servlet-apià javax.servlet-api. Perdu une demi-heure de "débogage" ...: /
insan-e

Réponses:

116

Je préfère ajouter uniquement l'API Servlet en tant que dépendance,

Pour être honnête, je ne suis pas sûr de comprendre pourquoi mais tant pis ...

Les dépendances distinctes de Brabster ont été remplacées par des profils Java EE 6. Y a-t-il une source qui confirme cette hypothèse?

Le référentiel maven de Java.net offre en effet l'artefact suivant pour le 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>

Ce pot comprend 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.

Mais à ma connaissance, rien ne permet de dire que ces API ne seront pas distribuées séparément (dans le référentiel java.net ou ailleurs). Par exemple (ok, cela peut être un cas particulier), l'API JSF 2.0 est disponible séparément (dans le référentiel java.net):

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

Et en fait, vous pourriez obtenir javax.servlet-3.0.jarde et l' installer dans votre propre référentiel.

Pascal Thivent
la source
3
Une petite correction: javaee-web-api inclut EL 2.2 (Unified Expression Language 2.2), pas EL 1.2
Andrey
1
... et pour une utilisation gradle: compiler 'javax: javaee-web-api: 6.0'
Robert Christian
1
Notez que javaee-web-apine contient que des stubs de méthode (pas de code d'octet). Vous ne pouvez pas utiliser cette dépendance en dehors de la providedportée, c'est pourquoi je préfère la suggestion de Sa'ad.
Rafael Winterhalter
2
@Pascal - "Je préfère ajouter uniquement l'API Servlet comme dépendance" - vous le feriez si vous avez affaire à un conteneur de servlet pur (tomcat, jetty) vs un conteneur compatible JEE (TomEE, wildfly, etc.)
YoYo
1
le javaee-web-api a été mis à jour vers<version>7.0</version>
OJVM
461

Cela semble avoir été ajouté récemment:

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
la source
29
Vous devez ajouter <scope> fourni </scope>
Serkan Arıkuşu
1
Hé, cela fonctionne bien mais je ne suis pas sûr que ce soit la dépendance exacte à utiliser (avec Tomcat 7 par exemple); la raison en est que les sources attachées à cette dépendance ne correspondent pas à ce qui fonctionne réellement lorsque vous effectuez réellement le débogage.
Eugen
5
@TejaswiRana La portée fournie signifie qu'elle n'est pas conditionnée pour la guerre. La dépendance est disponible au moment de la compilation, vous vous y attendez dans le dossier de la bibliothèque du serveur.
banterCZ
5
Pourquoi ne s'est-il pas contenté de réutiliser l'artefactId servlet-api? Parce que c'est amusant d'ajouter <excludes>pour l'ancien artifactId (afin d'éviter d'avoir à la fois l'ancienne et la nouvelle API de servlet sur votre chemin de classe si l'une de vos dépendances dépend toujours de l'ancienne)? :)
Geoffrey De Smet
3
Pour info, la version la plus récente est javax.servlet-api-3.1.0. Assurez-vous simplement que votre conteneur Servlet peut gérer cette version. Par exemple, la version 8 de Tomcat peut gérer 3.1 .
Basil Bourque
25

Voici ce que j'utilise. Tous ces éléments se trouvent dans le centre et ont des sources.

Pour Tomcat 7 (Java 7, Servlet 3.0)

Remarque - Les API Servlet, JSP et EL sont fournies dans Tomcat. Seul JSTL (s'il est utilisé) doit être fourni avec l'application Web.

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

Pour 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
la source
Cela fonctionne, mais les dépendances prescrites finissent par se trouver dans la section Maven mais ne sont jamais incluses dans le fichier WAR car elles sont marquées comme "fournies". MAIS ... Je n'arrive jamais à faire en sorte que le projet utilise les fichiers JAR dans le répertoire lib Tomcat, même si j'ai inclus ce répertoire lib Tomcat dans le chemin de génération Eclipse, et ils peuvent clairement être vus là. Mon pom.xml ne peut jamais résoudre ces fichiers JAR Tomcat et nécessite toujours la version 3.0.1 du fichier JAR servlet-api du référentiel Maven local, plutôt que la version 3.0 fournie par Tomcat. Je ne sais pas pourquoi c'est ... quelqu'un peut-il expliquer?
Geeb du
Pouvez-vous indiquer quelle version de <groupId> javax.servlet </groupId> <artifactId> javax.servlet-api </artifactId> puis-je utiliser pour tomcat 8.5?
Gog1nA
24

Malheureusement, l'ajout de javaee- (web) -api en tant que dépendance ne vous donne pas le Javadoc ou la source à l'API Servlet pour les parcourir à partir de l'IDE. C'est également le cas pour toutes les autres dépendances (JPA, EJB, ...) Si vous avez besoin des sources de l'API Servlet / javadoc, vous pouvez ajouter ce qui suit à votre pom.xml (fonctionne au moins pour JBoss & Glassfish):

Dépôt:

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

Dépendance:

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

J'ai complètement supprimé le javaee-api de mes dépendances et l'ai remplacé par les parties discrètes (javax.ejb, javax.faces, ...) pour obtenir les sources et Javadocs pour toutes les parties de Java EE 6.

ÉDITER:

Voici la dépendance équivalente de Glassfish (bien que les deux dépendances devraient fonctionner, quel que soit le serveur d'applications que vous utilisez).

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.servlet</artifactId>
  <version>3.0</version>
  <scope>provided</scope>
</dependency>
Ingo Fischer
la source
1
Pourquoi devons-nous spécifier la version 1.0.0.Beta2, si c'est la version 3.0dont nous avons besoin? Cela le rend complexe.
Geoffrey De Smet
9

Le projet Apache Geronimo fournit une dépendance de l'API Servlet 3.0 sur le référentiel Maven Central:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-servlet_3.0_spec</artifactId>
    <version>1.0</version>
</dependency>
Patrick Crocker
la source
2
Cela fonctionne, et semble la manière la plus simple, merci! BTW Apache Geronimo a bien plus à offrir: mvnrepository.com/artifact/org.apache.geronimo.specs
stivlo
5

Juste pour les nouveaux arrivants.

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

J'ai trouvé un exemple de POM pour l' API Servlet 3.0 sur DZone à partir de septembre.

Nous vous suggérons d'utiliser le dépôt java.net, à http://download.java.net/maven/2/

Il y a des API Java EE dedans, par exemple http://download.java.net/maven/2/javax/javaee-web-api/6.0/ avec POM qui semblent être ce que vous cherchez, par exemple :

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

Je suppose que les conventions de version pour les API ont été modifiées pour correspondre à la version de la spécification EE globale (c'est-à-dire Java EE 6 vs Servlets 3.0) dans le cadre des nouveaux «profils». En regardant dans le JAR, on dirait que tous les trucs de servlet 3.0 sont là. Prendre plaisir!

brabster
la source
Merci, ça marche! La seule question qui reste est de savoir si les profils Java EE 6 ont remplacé des bibliothèques distinctes. (voir l'addendum dans ma question)
Deamon
Si vous en dépendez, vous ne pouvez pas faire de guerre portable (celle qui fonctionne sur JBoss, Tomcat, Jetty, ...), car pour Tomcat / Jetty, vous devrez mettre une partie de cette dépendance fournie (servlet) et une partie non fournie (cdi), ce qui est impossible.
Geoffrey De Smet
3

Un moyen pratique (recommandé par JBoss) d'inclure les dépendances Java EE 6 est illustré ci-dessous. En conséquence, les dépendances sont placées séparément (pas toutes dans un seul pot comme dans javaee-web-api), les fichiers source et javadocs des bibliothèques sont disponibles pour téléchargement à partir du référentiel maven.

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

Pour inclure uniquement les dépendances individuelles, la dependencyManagementsection et la portée importpeuvent être utilisées:

    <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
la source
-3

Essayez ce code ...

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>
Josh
la source
Les dépendances en phase alpha ne conviennent pas toujours à une application de production.
Stephan