Dipendenza Maven per l'API Servlet 3.0?


229

Come posso dire a Maven 2 di caricare l'API Servlet 3.0?

Provai:

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

Uso http://repository.jboss.com/maven2/ ma quale repository sarebbe corretto?

Addendum:

Funziona con una dipendenza per l'intera API Java EE 6 e le seguenti impostazioni:

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

Preferirei solo aggiungere l'API Servlet come dipendenza, ma "Brabster" potrebbe avere ragione nel dire che dipendenze separate sono state sostituite dai profili Java EE 6. C'è una fonte che conferma questo assunto?


84
Nessuna fonte, nessun javadocs nel repository java.net/maven/2. Oracle, vai all'inferno!
Stepancheg,

2
L'uso di javaee-Api invece di servlet-api non fornisce la stessa versione di javax.servlet.ServletContext. Sto usando Spring Framework 3.1 e utilizzo Dynamic Dispathcer (annotazione). La risposta di Sa'ad è l'unica risposta che funziona per me. Non dovresti davvero andare con Pascal in quanto sembra essere più generico. Cavolo ... il gradle batte maven nel risolvere le dipendenze.
Mukus,

OMG, hanno cambiato il nome del manufatto da servlet-apia javax.servlet-api.
Ho

Risposte:


116

Preferirei aggiungere l'API Servlet solo come dipendenza,

Ad essere sincero, non sono sicuro di capire perché, ma non importa ...

Le dipendenze separate di Brabster sono state sostituite dai profili Java EE 6. C'è una fonte che conferma questo assunto?

Il repository Maven di Java.net offre infatti il ​​seguente artefatto per il 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>

Questo vaso include 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.

Ma per quanto ne so, nulla permette di dire che queste API non saranno distribuite separatamente (nel repository java.net o altrove). Ad esempio (ok, potrebbe trattarsi di un caso particolare), l'API JSF 2.0 è disponibile separatamente (nel repository java.net):

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

E in realtà, potresti ottenere javax.servlet-3.0.jarda e installarlo nel tuo repository.


3
Una piccola correzione: javaee-web-api include EL 2.2 (Unified Expression Language 2.2), non EL 1.2
Andrey

1
... e per l'uso graduale: compilare 'javax: javaee-web-api: 6.0'
Robert Christian,

1
Si noti che javaee-web-apicontiene solo stub di metodo (nessun codice byte). Non puoi usare questa dipendenza al di fuori provideddell'ambito ed è per questo che preferisco il suggerimento di Sa'ad.
Rafael Winterhalter,

2
@Pascal - "Preferirei aggiungere l'API Servlet solo come dipendenza" - lo faresti se hai a che fare con un contenitore servlet puro (tomcat, molo) vs un contenitore conforme a JEE (TomEE, wildfly, ecc.)
YoYo

1
il JavaEE-web-api è stato aggiornato per<version>7.0</version>
OJVM

461

Questo sembra essere aggiunto di recente:

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>

29
Devi aggiungere <scope> fornito </scope>
Serkan Arıkuşu

1
Ehi, funziona benissimo ma non sono sicuro che questa sia la dipendenza esatta da usare (con Tomcat 7 per esempio); il motivo è che le fonti associate a questa dipendenza non corrispondono a ciò che è effettivamente in esecuzione quando si esegue effettivamente il debug.
Eugen,

5
@TejaswiRana L'ambito fornito significa che non è impacchettato per la guerra. La dipendenza è disponibile al momento della compilazione, è prevista nella cartella della libreria del server.
banterCZ

5
Perché non ha semplicemente riutilizzato l'artefatto servlet-api? Perché è divertente aggiungere <excludes>per il vecchio artefattoId (al fine di evitare di ottenere l'API servlet vecchio e nuovo sul tuo percorso di classe se una delle tue dipendenze dipende ancora da quella vecchia)? :)
Geoffrey De Smet,

3
Cordiali saluti, la versione più recente è javax.servlet-api-3.1.0. Assicurati solo che il tuo contenitore Servlet sia in grado di gestire quella versione. Ad esempio, la versione 8 di Tomcat può gestire 3.1 .
Basil Bourque,


25

Ecco cosa uso. Tutti questi sono nel centro e hanno fonti.

Per Tomcat 7 (Java 7, Servlet 3.0)

Nota: le API Servlet, JSP ed EL sono fornite in Tomcat. Solo JSTL (se utilizzato) deve essere fornito in bundle con l'app 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>

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

Funziona, ma le dipendenze prescritte finiscono per essere nella sezione Maven ma non sono mai state incluse nel file WAR poiché sono contrassegnate come "fornite". MA ... Non riesco mai a far sì che il progetto usi i JAR nella directory lib di Tomcat, anche se ho incluso questa directory lib di Tomcat nel percorso di compilazione di Eclipse, e possono essere chiaramente visti lì. Il mio pom.xml non può mai risolvere questi JAR Tomcat e richiede sempre la versione 3.0.1 del JAR servlet-api dal repository Maven locale, anziché la versione 3.0 fornita da Tomcat. Non ho idea del perché questo sia ... qualcuno può spiegare?
Accidenti,

Puoi fornire quale versione di <groupId> javax.servlet </groupId> <artifactId> javax.servlet-api </artifactId> posso usare per Tomcat 8.5?
Gog1nA,

24

Sfortunatamente, l'aggiunta di javaee- (web) -api come dipendenza non fornisce Javadoc o Source all'Aplet Servlet per sfogliarli dall'IDE. Questo vale anche per tutte le altre dipendenze (JPA, EJB, ...) Se hai bisogno delle fonti / javadoc dell'API Servlet, puoi aggiungere quanto segue a pom.xml (funziona almeno per JBoss e 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>

Dipendenza:

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

Ho rimosso completamente il javaee-api dalle mie dipendenze e l'ho sostituito con le parti discrete (javax.ejb, javax.faces, ...) per ottenere i sorgenti e Javadocs per tutte le parti di Java EE 6.

MODIFICARE:

Ecco l'equivalente dipendenza Glassfish (sebbene entrambe le dipendenze dovrebbero funzionare, indipendentemente dall'apperver che usi).

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.servlet</artifactId>
  <version>3.0</version>
  <scope>provided</scope>
</dependency>

1
Perché dobbiamo specificare la versione 1.0.0.Beta2, se è la versione di 3.0cui abbiamo bisogno? Questo lo rende complesso.
Geoffrey De Smet,

9

Il progetto Apache Geronimo fornisce una dipendenza API Servlet 3.0 sul repository Maven Central:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-servlet_3.0_spec</artifactId>
    <version>1.0</version>
</dependency>

2
Funziona e sembra il modo più semplice, grazie! BTW Apache Geronimo ha molto altro da offrire: mvnrepository.com/artifact/org.apache.geronimo.specs
stivlo

5

Solo per i nuovi arrivati.

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

4

Ho trovato un POM di esempio per l' API Servlet 3.0 su DZone da settembre.

Ti suggerisco di usare il repository java.net, su http://download.java.net/maven/2/

Ci sono API Java EE lì dentro, ad esempio http://download.java.net/maven/2/javax/javaee-web-api/6.0/ con POM che sembrano essere ciò che stai cercando, ad esempio :

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

Immagino che le convenzioni di versione per le API siano state modificate per corrispondere alla versione delle specifiche EE complessive (ovvero Java EE 6 vs. Servlet 3.0) come parte dei nuovi "profili". Guardando nel JAR, sembra che tutte le cose servlet 3.0 siano lì dentro. Godere!


Grazie, funziona! L'unica domanda rimanente è se i profili Java EE 6 hanno sostituito le librerie separate. (vedi addendum nella mia domanda)
Deamon il

Se dipendi da questo, non puoi creare una guerra portatile (una che funziona su JBoss, Tomcat, Jetty, ...), perché per Tomcat / Jetty, dovrai mettere parte di quella dipendenza fornita (servlet) e parte di essa non fornita (cdi), il che è impossibile.
Geoffrey De Smet,

3

Di seguito è illustrato un modo conveniente (consigliato JBoss) per includere le dipendenze Java EE 6. Di conseguenza le dipendenze vengono posizionate separatamente (non tutte in un vaso come in javaee-web-api), i file di origine e i javadocs delle librerie sono disponibili per il download dal repository di 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>

Per includere solo le singole dipendenze, dependencyManagementè importpossibile utilizzare la sezione e l'ambito :

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

-3

Prova questo codice ...

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>

Le dipendenze nella fase alfa non sono sempre adatte per l'applicazione di produzione.
Stephan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.