2009-12-30 41 views
214

Làm thế nào tôi có thể yêu cầu Maven 2 tải API Servlet 3.0?Phụ thuộc Maven cho API Servlet 3.0?

tôi đã cố gắng:

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

tôi sử dụng http://repository.jboss.com/maven2/ nhưng những gì kho sẽ có đúng không?

Phụ Lục:

Nó hoạt động với một sự phụ thuộc cho toàn bộ Java EE 6 API 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 muốn chỉ thêm API Servlet như phụ thuộc, nhưng "Brabster" có thể đúng là 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?

+81

Không có nguồn, không có javadocs trong kho lưu trữ java.net/maven/2. Oracle, đi địa ngục! – stepancheg

+2

Sử dụng javaee-Api thay cho servlet-api không cung cấp cho bạn cùng phiên bản javax.servlet.ServletContext. Tôi đang sử dụng khung công tác Spring 3.1 và sử dụng dispathcer độ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 đó có vẻ chung chung hơn. Heck .. gradle đập maven trong việc giải quyết các phụ thuộc. – Mukus

+0

OMG, họ đã thay đổi ** tên tạo tác ** từ 'servlet-api' thành' javax.servlet-api'. Mất nửa giờ "gỡ lỗi" ...:/ –

Trả lời

106

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

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

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

Các kho maven từ Java.net thực sự cung cấp các vật sau đây 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> 

jar 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 với kiến ​​thức 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 biệt (trong kho lưu trữ java.net hoặc ở một nơi khác). Ví dụ (ok, nó có thể là một trường hợp đặc biệt), API JSF 2.0 được bá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à trên thực tế, bạn có thể nhận javax.servlet-3.0.jar từ there và cài đặt nó trong của riêng bạn kho.

+3

Một sửa đổi nhỏ: javaee-web-api bao gồm EL 2.2 (Ngôn ngữ biểu thức thống nhất 2.2), không phải là EL 1.2 – Andrey

+1

... và để sử dụng gradle: biên dịch 'javax: javaee-web-api: 6.0' –

+1

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

4

Tôi đã tìm thấy POM mẫu cho số Servlet 3.0 API on DZone từ tháng 9.

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

Có Java EE API trong đó, ví dụ http://download.java.net/maven/2/javax/javaee-web-api/6.0/ với POM mà hình như họ có thể là những gì bạn đang sau, ví dụ:

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

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

+0

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

+0

Nếu bạn phụ thuộc vào điều này, bạn không thể làm cho chiến tranh di động (một trong những hoạt động trên JBoss, Tomcat, Jetty, ...), bởi vì đối với Tomcat/Jetty, bạn sẽ cần phải đặ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), điều đó là không thể. –

24

Thật không may, việc thêm javaee- (web) -api làm phụ thuộc không cung cấp cho bạn Javadoc hoặc Nguồn vào Servlet Api để 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 Servlet API nguồn/javadoc, bạn có thể thêm dòng sau vào pom.xml của bạn (chỉ hoạt động ít nhất là cho JBoss & 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> 

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 đã xóa hoàn toàn javaee-api khỏi các phụ thuộc của mình và thay thế bằng các phần rời rạc (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.

EDIT:

Đây là sự phụ thuộc Glassfish tương đương (mặc dù cả hai phụ thuộc nên làm việc, không có vấn đề gì appserver bạn sử dụng).

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

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.0' mà chúng ta cần? Điều này làm cho nó phức tạp. –

9

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

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

Công trình này, và có vẻ là cách đơn giản nhất, cảm ơn! BTW Apache Geronimo có nhiều hơn nữa để cung cấp: http://mvnrepository.com/artifact/org.apache.geronimo.specs – stivlo

3

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

Để đưa phụ thuộc cá nhân mà thôi, dependencyManagement phần và phạm vi import 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> 
35

Hoặc bạn có thể sử dụng Trung Maven Repository với 3,0 API Servlet mà cũng được cung cấp cho máy chủ Tomcat 7.0.X

<dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-servlet-api</artifactId> 
     <version>7.0.21</version> 
     <scope>provided</scope> 
    </dependency> 

từ đây: http://repo2.maven.org/maven2/org/apache/tomcat/tomcat-servlet-api/7.0.21/

+0

đó là rất hữu ích, không bao giờ nghĩ đến việc đó. –

443

Điều này dường như được bổ sung 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> 
+27

Bạn nên thêm được cung cấp

+1

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

+0

Phạm vi cung cấp có nghĩa là gì? – Mukus

17

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

Đối với Tomcat 7 (Java 7, Servlet 3,0)

Note - Servlet, JSP và EL API được cung cấp trong Tomcat. Chỉ cần JSTL (nếu sử dụng) đi kèm 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> 
+0

Không hoạt động nữa ... – Kartoch

+0

Tác phẩm này, nhưng các phụ thuộc theo quy định sẽ kết thúc trong phần Maven nhưng không bao giờ được bao gồm trong tệp WAR khi chúng được đánh dấu là "được cung cấp". NHƯNG ... Tôi không bao giờ có thể nhận dự án để sử dụng các JAR trong thư mục lib Tomcat, mặc dù tôi đã đưa thư mục lib Tomcat này vào đường dẫn xây dựng Eclipse, và chúng có thể thấy rõ ở đó. 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ì phiên bản 3.0 của Tomcat. Tôi không có ý tưởng tại sao điều này là ... bất cứ ai có thể giải thích? – Geeb

+0

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

-3

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

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

Các 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

4

Chỉ cần cho người mới.

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.1.0</version> 
    <scope>provided</scope> 
</dependency> 
Các vấn đề liên quan