Ketergantungan maven untuk Servlet 3.0 API?

229

Bagaimana saya bisa memberi tahu Maven 2 untuk memuat API Servlet 3.0?

Saya mencoba:

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

Saya menggunakan http://repository.jboss.com/maven2/ tetapi repositori apa yang benar?

Tambahan:

Ini berfungsi dengan ketergantungan untuk seluruh Java EE 6 API dan pengaturan berikut:

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

Saya lebih suka hanya menambahkan Servlet API sebagai dependensi, tetapi "Brabster" mungkin benar bahwa dependensi yang terpisah telah digantikan oleh Java EE 6 Profiles. Apakah ada sumber yang mengkonfirmasi asumsi ini?

deamon
sumber
84
Tidak ada sumber, tidak ada javadocs di repositori java.net/maven/2. Oracle, pergilah ke neraka!
stepancheg
2
Menggunakan javaee-Api sebagai ganti servlet-api tidak memberi Anda versi yang sama dari javax.servlet.ServletContext. Saya menggunakan kerangka kerja 3.1 dan menggunakan dispathcer dinamis (anotasi). Jawaban Sa'ad adalah satu-satunya jawaban yang cocok untuk saya. Anda benar-benar tidak boleh menggunakan Pascal karena tampaknya lebih umum. Heck .. gradle mengalahkan pakar dalam menyelesaikan dependensi.
Mukus
OMG, mereka mengubah nama artefak dari servlet-apimenjadi javax.servlet-api. Kehilangan setengah jam "debugging" ...: /
insan-e

Jawaban:

116

Saya lebih suka hanya menambahkan API Servlet sebagai ketergantungan,

Sejujurnya, saya tidak yakin untuk mengerti mengapa tetapi tidak apa-apa ...

Ketergantungan terpisah Brabster telah digantikan oleh Java EE 6 Profiles. Apakah ada sumber yang mengkonfirmasi asumsi ini?

Repositori pakar dari Java.net memang menawarkan artefak berikut untuk 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>

Guci ini termasuk 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.

Tetapi setahu saya, tidak ada yang memungkinkan untuk mengatakan bahwa API ini tidak akan didistribusikan secara terpisah (di repositori java.net atau di tempat lain). Sebagai contoh (ok, ini mungkin kasus tertentu), JSF 2.0 API tersedia secara terpisah (dalam repositori java.net):

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

Dan sebenarnya, Anda bisa mendapatkannya javax.servlet-3.0.jardari sana dan menginstalnya di repositori Anda sendiri.

Thivent Pascal
sumber
3
Satu koreksi kecil: javaee-web-api termasuk EL 2.2 (Unified Expression Language 2.2), bukan EL 1.2
Andrey
1
... dan untuk penggunaan bertahap: kompilasi 'javax: javaee-web-api: 6.0'
Robert Christian
1
Perhatikan bahwa javaee-web-apihanya berisi potongan metode (tidak ada kode byte). Anda tidak dapat menggunakan dependensi ini di luar providedlingkup yang mengapa saya lebih suka saran dari Sa'ad.
Rafael Winterhalter
2
@Pascal - "Saya lebih suka hanya menambahkan API Servlet sebagai ketergantungan" - Anda akan melakukannya jika Anda berurusan dengan wadah servlet murni (tomcat, dermaga) vs kontainer yang sesuai dengan JEE (TomEE, wildfly, dll)
YoYo
1
yang JavaEE-web-api telah diperbarui untuk<version>7.0</version>
OJVM
461

Ini sepertinya ditambahkan baru-baru ini:

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
sumber
29
Anda harus menambahkan <scope> disediakan </scope>
Serkan Arıkuşu
1
Hai, Ini berfungsi dengan baik tetapi saya tidak yakin ini adalah ketergantungan yang tepat untuk digunakan (misalnya dengan Tomcat 7); alasannya adalah bahwa sumber yang dilampirkan pada dependensi ini tidak cocok dengan apa yang sebenarnya berjalan ketika Anda benar-benar melakukan debugging.
Eugen
5
@TejaswiRana Disediakan ruang lingkup berarti bahwa itu tidak dikemas untuk perang. Ketergantungan tersedia pada waktu kompilasi, Anda mengharapkannya di folder pustaka server.
banterCZ
5
Mengapa itu tidak menggunakan kembali artifactId saja servlet-api? Karena itu menyenangkan untuk menambahkan <excludes>untuk artifactId lama (untuk mencegah mendapatkan api servlet lama dan baru di classpath Anda jika salah satu dependensi Anda masih tergantung pada yang lama)? :)
Geoffrey De Smet
3
FYI, versi terbaru adalah javax.servlet-api-3.1.0. Pastikan wadah Servlet Anda dapat menangani versi itu. Misalnya Versi 8 dari Tomcat dapat menangani 3.1 .
Basil Bourque
25

Inilah yang saya gunakan. Semua ini ada di Pusat dan memiliki sumber.

Untuk Tomcat 7 (Java 7, Servlet 3.0)

Catatan - Servlet, JSP dan EL API disediakan di Tomcat. Hanya JSTL (jika digunakan) yang perlu dibundel dengan aplikasi 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>

Untuk 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
sumber
Ini berfungsi, tetapi dependensi yang ditentukan berakhir di bagian Maven tetapi tidak pernah disertakan dalam file WAR karena ditandai sebagai "disediakan". TETAPI ... Saya tidak pernah bisa mendapatkan proyek untuk menggunakan JAR di direktori lib Tomcat, meskipun saya telah memasukkan direktori lib Tomcat ini di jalur pembangunan Eclipse, dan mereka jelas dapat dilihat di sana. Pom.xml saya tidak pernah bisa menyelesaikan JAR Tomcat ini dan selalu membutuhkan JAR servlet-api versi 3.0.1 dari repo Maven lokal, daripada persediaan Tomcat versi 3.0. Saya tidak tahu mengapa ini ... bisa ada yang menjelaskan?
Geeb
Dapatkah Anda memberikan versi mana dari <groupId> javax.servlet </groupId> <artifactId> javax.servlet-api </artifactId> yang dapat saya gunakan untuk tomcat 8.5?
Gog1nA
24

Sayangnya, menambahkan javaee- (web) -api sebagai dependensi tidak memberi Anda Javadoc atau Sumber ke Servlet Api untuk menjelajahinya dari dalam IDE. Ini juga merupakan kasus untuk semua dependensi lainnya (JPA, EJB, ...) Jika Anda memerlukan sumber Servlet API / javadoc, Anda dapat menambahkan yang berikut ke pom.xml Anda (setidaknya berfungsi untuk JBoss & Glassfish):

Gudang:

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

Ketergantungan:

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

Saya benar-benar menghapus javaee-api dari dependensi saya dan menggantinya dengan bagian diskrit (javax.ejb, javax.faces, ...) untuk mendapatkan sumber dan Javadocs untuk semua bagian Java EE 6.

EDIT:

Berikut ini adalah ketergantungan Glassfish yang setara (meskipun kedua dependensi itu berfungsi, tidak peduli apa pun appserver yang Anda gunakan).

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.servlet</artifactId>
  <version>3.0</version>
  <scope>provided</scope>
</dependency>
Ingo Fischer
sumber
1
Mengapa kita perlu menentukan versi 1.0.0.Beta2, jika itu versi 3.0yang kita butuhkan? Ini membuatnya kompleks.
Geoffrey De Smet
9

Proyek Apache Geronimo menyediakan ketergantungan Servlet 3.0 API pada repo Maven Central:

<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-servlet_3.0_spec</artifactId>
    <version>1.0</version>
</dependency>
Patrick Crocker
sumber
2
Ini berfungsi, dan tampaknya cara paling sederhana, terima kasih! BTW Apache Geronimo menawarkan lebih banyak: mvnrepository.com/artifact/org.apache.geronimo.specs
stivlo
5

Hanya untuk pendatang baru.

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

Saya menemukan contoh POM untuk API Servlet 3.0 di DZone mulai September.

Sarankan Anda menggunakan repo java.net, di http://download.java.net/maven/2/

Ada Java EE APIs di sana, misalnya http://download.java.net/maven/2/javax/javaee-web-api/6.0/ dengan POM yang terlihat seperti apa yang Anda cari, misalnya :

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

Saya menduga bahwa konvensi versi untuk API telah diubah agar sesuai dengan versi spesifikasi EE keseluruhan (yaitu Java EE 6 vs Servlets 3.0) sebagai bagian dari 'profil' baru. Melihat di JAR, sepertinya semua 3.0 servlet ada di sana. Nikmati!

brabster
sumber
Terima kasih, ini berhasil! Satu-satunya pertanyaan yang tersisa adalah, jika Profil Java EE 6 diganti libs terpisah. (lihat tambahan dalam pertanyaan saya)
deamon
Jika Anda bergantung pada ini, Anda tidak dapat membuat perang portabel (perang yang bekerja pada JBoss, Tomcat, Jetty, ...), karena untuk Tomcat / Jetty, Anda harus meletakkan bagian dari ketergantungan yang disediakan (servlet) dan bagian dari itu tidak disediakan (cdi), yang tidak mungkin.
Geoffrey De Smet
3

Cara mudah (disarankan JBoss) untuk memasukkan dependensi Java EE 6 ditunjukkan di bawah ini. Akibatnya dependensi ditempatkan secara terpisah (tidak semua dalam satu stoples seperti di javaee-web-api), file sumber dan javadocs perpustakaan tersedia untuk diunduh dari repositori 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>

Untuk memasukkan dependensi individual saja, dependencyManagementbagian dan ruang lingkup importdapat digunakan:

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

Coba kode ini ...

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>
Josh
sumber
Ketergantungan pada tahap alfa tidak selalu cocok untuk aplikasi produksi.
Stephan