Maven phụ thuộc cho API Servlet 3.0?


229

Làm cách nào tôi có thể yêu cầu Maven 2 tải API Servlet 3.0?

Tôi đã thử:

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

Tôi sử dụng http://reposective.jboss.com/maven2/ nhưng kho lưu trữ nào sẽ đúng?

Phụ lục:

Nó hoạt động với sự phụ thuộc cho toàn bộ API Java EE 6 và các cài đặt sau:

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

Tôi chỉ muốn thêm API Servlet làm phụ thuộc, nhưng "Brabster" có thể đúng khi các phụ thuộc riêng biệt đã được thay thế bằng Hồ sơ Java EE 6. Có một nguồn xác nhận giả định này?


84
Không có nguồn, không có javadocs trong kho java.net/maven/2. Oracle, xuống địa ngục đi!
stepancheg

2
Sử dụng javaee-Api thay cho servlet-api không cung cấp cho bạn cùng một phiên bản javax.servlet.ServletContext. Tôi đang sử dụng khung mùa xuân 3.1 và sử dụng bộ phân phối động (chú thích). Câu trả lời của Sa'ad là câu trả lời duy nhất phù hợp với tôi. Bạn thực sự không nên đi với Pascal vì điều đó dường như chung chung hơn. Heck .. gradle đập maven trong việc giải quyết phụ thuộc.
Mukus

OMG, họ đã thay đổi tên hiện vật từ servlet-apithành javax.servlet-api. Mất nửa giờ "gỡ lỗi" ...: /
insan-e

Câu trả lời:


116

Tôi chỉ muốn thêm API Servlet làm phụ thuộc,

Thành thật mà nói, tôi không chắc tại sao nhưng đừng bận tâm ...

Các phụ thuộc riêng biệt của Brabster đã được thay thế bằng Hồ sơ Java EE 6. Có một nguồn xác nhận giả định này?

Kho lưu trữ maven từ Java.net thực sự cung cấp các tạo phẩm sau cho 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>

Bình này bao gồm 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.

Nhưng theo hiểu biết của tôi, không có gì cho phép nói rằng các API này sẽ không được phân phối riêng (trong kho java.net hoặc một nơi nào khác). Ví dụ: ok, có thể là một trường hợp cụ thể), API JSF 2.0 có sẵn riêng (trong kho java.net):

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

Và thực tế, bạn có thể lấy javax.servlet-3.0.jartừ đó và cài đặt nó trong kho lưu trữ của riêng bạn.


3
Một điều chỉnh nhỏ: javaee-web-api bao gồm EL 2.2 (Ngôn ngữ biểu hiện thống nhất 2.2), không phải EL 1.2
Andrey

1
... và để sử dụng lớp: biên dịch 'javax: javaee-web-api: 6.0'
Robert Christian

1
Lưu ý rằng javaee-web-apichỉ chứa sơ khai phương thức (không có mã byte). Bạn không thể sử dụng sự phụ thuộc này ngoài providedphạm vi, đó là lý do tại sao tôi đề xuất trước đề xuất của Sa'ad.
Rafael Winterhalter

2
@Pascal - "Tôi chỉ muốn thêm API Servlet làm phụ thuộc" - bạn sẽ làm điều đó nếu bạn đang xử lý một thùng chứa servlet thuần túy (tomcat, jetty) so với một thùng chứa tuân thủ JEE (TomEE, wildfly, v.v.)
YoYo

1
các JavaEE-web-api đã được cập nhật<version>7.0</version>
OJVM

461

Điều này dường như được thêm vào gần đây:

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
Bạn nên thêm <scope> được cung cấp </ scope>
Serkan Arıkuşu

1
Này, Điều này hoạt động tốt nhưng tôi không chắc đây là phụ thuộc chính xác sẽ được sử dụng (ví dụ với Tomcat 7); Lý do là các nguồn được đính kèm với phụ thuộc này không khớp với những gì thực sự chạy khi bạn thực sự gỡ lỗi.
Eugen

5
@TejaswiRana Phạm vi được cung cấp có nghĩa là nó không được đóng gói để gây chiến. Sự phụ thuộc có sẵn tại thời gian biên dịch, bạn mong đợi nó trong thư mục thư viện máy chủ.
banterCZ

5
Tại sao nó không sử dụng lại artifactId servlet-api? Bởi vì thật thú vị khi thêm <excludes>vào artifactId cũ (để ngăn chặn cả api servlet cũ và mới trên classpath của bạn nếu một trong những phụ thuộc của bạn vẫn phụ thuộc vào cái cũ)? :)
Geoffrey De Smet

3
FYI, phiên bản gần đây nhất là javax.servlet-api-3.1.0. Chỉ cần chắc chắn rằng thùng chứa Servlet của bạn có thể xử lý phiên bản đó. Ví dụ Phiên bản 8 của Tomcat có thể xử lý 3.1 .
Basil Bourque


25

Đây là những gì tôi sử dụng. Tất cả những thứ này đều ở miền Trung và có nguồn.

Dành cho Tomcat 7 (Java 7, Servlet 3.0)

Lưu ý - API Servlet, JSP và EL được cung cấp trong Tomcat. Chỉ JSTL (nếu được sử dụng) cần được gói cùng với ứng dụng 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>

Đối với 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>

Điều này hoạt động, nhưng các phụ thuộc theo quy định cuối cùng nằm trong phần Maven nhưng không bao giờ được bao gồm trong tệp WAR vì chúng được đánh dấu là "được cung cấp". NHƯNG ... Tôi không bao giờ có thể khiến dự án sử dụng các JAR trong thư mục lib Tomcat, mặc dù tôi đã bao gồm thư mục lib Tomcat này trong đường dẫn xây dựng Eclipse và có thể thấy rõ chúng ở đó. Pom.xml của tôi không bao giờ có thể giải quyết các JAR Tomcat này và luôn yêu cầu phiên bản 3.0.1 của JAR servlet-api từ repo Maven cục bộ, thay vì Tomcat phiên bản 3.0. Tôi không biết tại sao điều này ... có ai có thể giải thích?
Geeb

Bạn có thể cung cấp phiên bản nào của <groupId> javax.servlet </ groupId> <artifactId> javax.servlet-api </ artifactId> tôi có thể sử dụng cho tomcat 8.5 không?
Gog1nA

24

Thật không may, việc thêm javaee- (web) -api làm phụ thuộc sẽ không cung cấp cho bạn Javadoc hoặc Nguồn vào Api của Servlet để duyệt chúng từ bên trong IDE. Đây cũng là trường hợp cho tất cả các phụ thuộc khác (JPA, EJB, ...) Nếu bạn cần nguồn API / javadoc của Servlet, bạn có thể thêm phần sau vào pom.xml của mình (ít nhất là hoạt động cho JBoss & Glassfish):

Kho:

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

Phụ thuộc:

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

Tôi đã loại bỏ hoàn toàn javaee-api khỏi các phần phụ thuộc của mình và thay thế nó bằng các phần riêng biệt (javax.ejb, javax.faces, ...) để lấy các nguồn và Javadocs cho tất cả các phần của Java EE 6.

BIÊN TẬP:

Đây là phần phụ thuộc Glassfish tương đương (mặc dù cả hai phần phụ thuộc đều hoạt động, bất kể bạn sử dụng máy chủ ứng dụng nào).

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

1
Tại sao chúng ta cần chỉ định phiên bản 1.0.0.Beta2, nếu đó là phiên bản 3.0mà chúng ta cần? Điều này làm cho nó phức tạp.
Geoffrey De Smet

9

Dự án Apache Geronimo cung cấp sự phụ thuộc API Servlet 3.0 trên repo Maven Central:

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

2
Điều này hoạt động, và dường như cách đơn giản nhất, cảm ơn! BTW Apache Geronimo có nhiều hơn nữa để cung cấp: mvnreposective.com/artifact/org.apache.geronimo.specs
stivlo

5

Chỉ dành cho người mới.

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

4

Tôi đã tìm thấy một ví dụ POM cho API Servlet 3.0 trên DZone từ tháng 9.

Đề nghị bạn sử dụng repo java.net, tại http://doad.java.net/maven/2/

Có các API Java EE trong đó, ví dụ: http://doad.java.net/maven/2/javax/javaee-web-api/6.0/ với POM trông giống như chúng có thể là những gì bạn đang theo đuổi, ví dụ :

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

Tôi đoán rằng các quy ước phiên bản cho các API đã được thay đổi để phù hợp với phiên bản của thông số EE tổng thể (ví dụ Java EE 6 so với Servlets 3.0) như là một phần của 'hồ sơ' mới. Nhìn vào JAR, có vẻ như tất cả các công cụ servlet 3.0 đều ở đó. Thưởng thức!


Cảm ơn, nó hoạt động! Câu hỏi duy nhất còn lại là, nếu Hồ sơ Java EE 6 thay thế các lib riêng biệt. (xem phần phụ lục trong câu hỏi của tôi)
deamon

Nếu bạn phụ thuộc vào điều này, bạn không thể thực hiện chiến tranh di động (một cuộc chiến hoạt động trên JBoss, Tomcat, Jetty, ...), vì đối với Tomcat / Jetty, bạn sẽ cần đặt một phần của sự phụ thuộc đó được cung cấp (servlet) và một phần của nó không được cung cấp (cdi), đó là điều không thể.
Geoffrey De Smet

3

Một cách thuận tiện (khuyến nghị JBoss) để bao gồm các phụ thuộc Java EE 6 được trình bày bên dưới. Do đó, các phụ thuộc kết quả được đặt riêng (không phải tất cả trong một tệp như trong javaee-web-api), các tệp nguồn và javadocs của các thư viện có sẵn để tải xuống từ kho lưu trữ của 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>

Để chỉ bao gồm các phụ thuộc riêng lẻ, dependencyManagementphần và phạm vi importcó thể được sử dụng:

    <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

Hãy thử mã này ...

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

Sự phụ thuộc trong giai đoạn alpha không phải lúc nào cũng phù hợp cho ứng dụng sản xuất.
Stephan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.