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?


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.


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>

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>

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>

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>

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>

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!


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>

-3

Coba kode ini ...

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

Ketergantungan pada tahap alfa tidak selalu cocok untuk aplikasi produksi.
Stephan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.