Maven พึ่งพาสำหรับ API ของ Servlet 3.0


229

ฉันจะบอกให้ Maven 2 โหลด Servlet 3.0 API ได้อย่างไร

ฉันเหนื่อย:

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

ฉันใช้http://repository.jboss.com/maven2/แต่ที่เก็บข้อมูลใดที่จะถูกต้อง

ภาคผนวก:

มันทำงานร่วมกับการพึ่งพาสำหรับ Java EE 6 API ทั้งหมดและการตั้งค่าต่อไปนี้:

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

ฉันต้องการเพิ่มเฉพาะ Servlet API เป็นการพึ่งพา แต่ "Brabster" อาจถูกต้องที่การอ้างอิงแยกได้ถูกแทนที่ด้วยโปรไฟล์ Java EE 6 มีแหล่งที่มาที่ยืนยันสมมติฐานนี้หรือไม่?


84
ไม่มีแหล่งที่มาไม่มี javadocs ในที่เก็บ java.net/maven/2 Oracle ไปที่นรก!
stepancheg

2
การใช้ javaee-Api แทน servlet-api ไม่ได้ให้ javax.servlet.ServletContext รุ่นเดียวกัน ฉันใช้ Spring Framework 3.1 และใช้ Dynamic dispathcer (คำอธิบายประกอบ) คำตอบของ Sa'ad เป็นคำตอบเดียวที่เหมาะกับฉัน คุณไม่ควรไปกับปาสกาลจริงๆ Heck .. gradle เต้น maven ในการแก้ไขการอ้างอิง
Mukus

OMG พวกเขาเปลี่ยนชื่อสิ่งประดิษฐ์จากไปservlet-api javax.servlet-apiสูญเสียการ "ดีบั๊ก" ครึ่งชั่วโมง ... : /
insan-e

คำตอบ:


116

ฉันต้องการเพิ่มเฉพาะ Servlet API เป็นการพึ่งพา

พูดตามตรงฉันไม่แน่ใจว่าจะเข้าใจว่าทำไม แต่ไม่สนใจ ...

การอ้างอิงที่แยกกันของBrabsterนั้นถูกแทนที่ด้วย Java EE 6 Profiles มีแหล่งที่มาที่ยืนยันสมมติฐานนี้หรือไม่?

ที่เก็บ maven จาก Java.net นำเสนอสิ่งประดิษฐ์ต่อไปนี้สำหรับ 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>

jar นี้ประกอบด้วย 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

แต่สำหรับความรู้ของฉันไม่มีอะไรที่อนุญาตให้พูดได้ว่า API เหล่านี้จะไม่ถูกแจกจ่ายแยกต่างหาก (ในที่เก็บ java.net หรือที่อื่น) ตัวอย่างเช่น (ตกลงอาจเป็นกรณีพิเศษ), JSF 2.0 API มีให้บริการแยกต่างหาก (ในที่เก็บ java.net):

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

และที่จริงคุณสามารถไปjavax.servlet-3.0.jarจากที่นั่นและติดตั้งในที่เก็บของคุณเอง


3
การแก้ไขเล็ก ๆ น้อย ๆ อย่างหนึ่ง: javaee-web-api รวมถึง EL 2.2 (Unified Expression Language 2.2) ไม่ใช่ EL 1.2
Andrey

1
... และสำหรับการใช้งาน gradle: รวบรวม 'javax: javaee-web-api: 6.0'
Robert Christian

1
โปรดทราบว่าjavaee-web-apiมีวิธีการไม่สมบูรณ์เท่านั้น (ไม่มีรหัสไบต์) คุณไม่สามารถใช้การพึ่งพานี้นอกprovidedขอบเขตซึ่งเป็นสาเหตุที่ฉันแนะนำข้อเสนอของ Sa'ad ไว้ล่วงหน้า
Rafael Winterhalter

2
@Pascal - "ฉันต้องการเพิ่มเฉพาะ Servlet API เป็นการพึ่งพา" - คุณจะทำเช่นนั้นหากคุณกำลังจัดการกับภาชนะ servlet บริสุทธิ์ (Tomcat, Jetty) เทียบกับภาชนะที่สอดคล้องกับ JEE (TomEE, wildfly, ฯลฯ )
YoYo

1
JavaEE เว็บ APIได้รับการปรับปรุง<version>7.0</version>
OJVM

461

ดูเหมือนว่าจะมีการเพิ่มเมื่อเร็ว ๆ นี้:

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
คุณควรเพิ่ม <scope> ที่ให้ไว้ </scope>
Serkan Arıkuşu

1
เฮ้มันใช้งานได้ดี แต่ฉันไม่แน่ใจว่านี่เป็นการอ้างอิงที่แน่นอนที่จะใช้ (ตัวอย่างเช่น Tomcat 7) สาเหตุคือแหล่งที่มาที่แนบมากับการอ้างอิงนี้ไม่ตรงกับสิ่งที่ทำงานจริง ๆ เมื่อคุณทำการดีบักจริง
Eugen

5
@TejaswiRana ขอบเขตที่ให้มาหมายความว่าไม่ได้บรรจุหีบห่อในการทำสงคราม การพึ่งพามีอยู่ในเวลารวบรวมคุณคาดหวังไว้ในโฟลเดอร์ไลบรารีเซิร์ฟเวอร์
banterCZ

5
ทำไมมันไม่ได้เป็นเพียงแค่นำมาใช้ใหม่ artifactId servlet-api? เพราะมันสนุกที่จะเพิ่ม<excludes>สำหรับวัตถุโบราณเก่า (เพื่อป้องกันไม่ให้ทั้ง servlet api เก่าและใหม่ใน classpath ของคุณถ้าหนึ่งในการพึ่งพาของคุณยังขึ้นอยู่กับเก่า) :)
Geoffrey De Smet

3
FYI javax.servlet-api-3.1.0รุ่นล่าสุดคือ ตรวจสอบให้แน่ใจว่าคอนเทนเนอร์ Servlet ของคุณสามารถรองรับเวอร์ชันนั้นได้ ตัวอย่างเช่นรุ่นที่ 8 ของ Tomcat สามารถจัดการ 3.1
Basil Bourque


25

นี่คือสิ่งที่ฉันใช้ ทั้งหมดนี้อยู่ในภาคกลางและมีแหล่งที่มา

สำหรับ Tomcat 7 (Java 7, Servlet 3.0)

หมายเหตุ - Servlet, JSP และ EL API มีให้ใน Tomcat ต้องรวม JSTL (หากใช้) กับเว็บแอป

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

สำหรับ 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>

งานนี้ แต่การอ้างอิงที่กำหนดไว้จะอยู่ในส่วน Maven แต่ไม่เคยรวมอยู่ในไฟล์ WAR เนื่องจากมีการทำเครื่องหมายเป็น "ให้" แต่ ... ฉันไม่เคยได้รับโครงการที่จะใช้ JAR ในไดเรกทอรี Tomcat lib แม้ว่าฉันได้รวมไดเรกทอรี Tomcat lib นี้ในเส้นทางการสร้าง Eclipse และพวกเขาสามารถมองเห็นได้อย่างชัดเจน pom.xml ของฉันไม่สามารถแก้ไข Tomcat JARs เหล่านี้และต้องการ servlet-api JAR เวอร์ชัน 3.0.1 จาก repo Maven ท้องถิ่นแทนที่จะเป็นอุปกรณ์รุ่น Tomcat 3.0 ฉันไม่รู้ว่าทำไมนี่คือ ... ใครสามารถอธิบายได้บ้าง
Geeb

คุณสามารถให้เวอร์ชันของ <groupId> javax.servlet </groupId> <artifactId> javax.servlet-api </artifactId> ฉันสามารถใช้กับ Tomcat 8.5 ได้หรือไม่
Gog1nA

24

น่าเสียดายที่การเพิ่ม javaee- (web) -api เป็นการพึ่งพาไม่ได้ให้ Javadoc หรือซอร์สไปยัง Servlet Api เพื่อเรียกดูจากภายใน IDE นี่เป็นกรณีสำหรับการอ้างอิงอื่น ๆ ทั้งหมด (JPA, EJB, ... ) หากคุณต้องการ Servlet API source / javadoc คุณสามารถเพิ่มสิ่งต่อไปนี้ใน pom.xml ของคุณ (ทำงานอย่างน้อยกับ JBoss & Glassfish):

พื้นที่เก็บข้อมูล:

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

การอ้างอิง:

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

ฉันลบ javaee-api ออกจากการอ้างอิงของฉันและแทนที่ด้วยส่วนแยก (javax.ejb, javax.faces, ... ) เพื่อให้ได้แหล่งและ Javadocs สำหรับทุกส่วนของ Java EE 6

แก้ไข:

นี่คือการพึ่งพา Glassfish เทียบเท่า (แม้ว่าการพึ่งพาทั้งสองควรทำงานไม่ว่าคุณใช้ appserver ใด)

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

1
ทำไมเราต้องระบุเวอร์ชัน1.0.0.Beta2หากเป็นเวอร์ชัน3.0ที่เราต้องการ สิ่งนี้ทำให้มันซับซ้อน
Geoffrey De Smet

9

โครงการ Apache Geronimo ให้บริการการพึ่งพา Servlet 3.0 API บน repo Maven Central:

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

2
มันใช้งานได้และดูเหมือนจะเป็นวิธีที่ง่ายที่สุดขอบคุณ! BTW Apache Geronimo มีอีกมากมายที่จะนำเสนอ: mvnrepository.com/artifact/org.apache.geronimo.specs
stivlo

5

เพียงสำหรับผู้มาใหม่

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

4

ฉันพบตัวอย่าง POM สำหรับServlet 3.0 API บน DZoneตั้งแต่เดือนกันยายน

แนะนำให้คุณใช้ repo ของ java.net ที่http://download.java.net/maven/2/

มี Java EE APIs อยู่ในนั้นตัวอย่างเช่นhttp://download.java.net/maven/2/javax/javaee-web-api/6.0/ด้วย POM ที่ดูเหมือนว่าพวกเขาจะเป็นอย่างที่คุณต้องการ :

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

ฉันคาดเดาว่าอนุสัญญาเวอร์ชันสำหรับ API ได้รับการเปลี่ยนแปลงเพื่อให้ตรงกับรุ่นของข้อมูลจำเพาะ EE โดยรวม (เช่น Java EE 6 เทียบกับ Servlets 3.0) เป็นส่วนหนึ่งของ 'โปรไฟล์' ใหม่ มองใน JAR ดูเหมือนว่าทุกสิ่ง 3.0 servlet อยู่ในนั้น สนุก!


ขอบคุณมันใช้งานได้! คำถามเดียวที่เหลืออยู่คือถ้าโปรไฟล์ Java EE 6 แทนที่ libs แยกกัน (ดูภาคผนวกในคำถามของฉัน)
deamon

หากคุณขึ้นอยู่กับสิ่งนี้คุณไม่สามารถทำสงครามแบบพกพาได้ (สิ่งหนึ่งที่ใช้ได้กับ JBoss, Tomcat, Jetty, ... ) เพราะสำหรับ Tomcat / Jetty คุณจะต้องมีส่วนหนึ่งของการพึ่งพาที่ให้ไว้ (servlet) และ ส่วนหนึ่งของมันไม่ได้ให้ (cdi) ซึ่งเป็นไปไม่ได้
Geoffrey De Smet

3

วิธีที่สะดวก (แนะนำ JBoss) เพื่อรวมการพึ่งพา Java EE 6 แสดงไว้ด้านล่าง เนื่องจากการพึ่งพาผลลัพธ์จะถูกวางแยกต่างหาก (ไม่ใช่ทั้งหมดในหนึ่งขวดเหมือนใน javaee-web-api) ไฟล์ต้นฉบับและ javadocs ของไลบรารีพร้อมให้ดาวน์โหลดจาก maven repository

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

ในการรวมการอ้างอิงส่วนบุคคลเท่านั้นdependencyManagementส่วนและขอบเขตimportสามารถใช้:

    <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

ลองรหัสนี้ ...

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

การพึ่งพาในระยะอัลฟานั้นไม่เหมาะกับการใช้งานในการผลิตเสมอไป
เตฟาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.