2012-02-14 25 views
17

Tôi đã sử dụng nguyên mẫu Maven (webapp-javaee6) để tạo dự án Java EE 6 mới nhưng không hiểu tại sao một số thứ nhất định được đặt bên trong phần tử build của POM. Để cụ thể, tôi không hiểu tại sao javaee-endorsed-api.jar được sao chép sang thư mục được xác nhận. Theo câu trả lời cho câu hỏi this, điều này là cần thiết để biên dịch nhưng dự án của tôi biên dịch tốt khi tôi xóa phần tử plugin liên quan dưới build.Dự án Maven mới sử dụng các nguyên mẫu: tại sao javaee-endorsed-api.jar được sao chép trong POM?

javax:javaee-web-api đã được cung cấp dưới dạng phụ thuộc trong POM, điều này có thể không được sử dụng để biên dịch không?

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <compilerArguments> 
        <endorseddirs>${endorsed.dir}</endorseddirs> 
       </compilerArguments> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.1</version> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${endorsed.dir}</outputDirectory> 
         <silent>true</silent> 
         <artifactItems> 
          <artifactItem> 
           <groupId>javax</groupId> 
           <artifactId>javaee-endorsed-api</artifactId> 
           <version>6.0</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+2

Cá nhân tôi thích bắt đầu với [Maven Archetype Webapp] (http://maven.apache.org/guides/mini/guide-webapp.html) ngọt ngào và đơn giản, và sau đó thêm phụ thuộc và các chất liệu ưa thích theo yêu cầu dự án đi về phía trước. – Nishant

Trả lời

5

Cần biên dịch, vì đó cũng là một sự phụ thuộc vào hiện tượng này:

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

Maven manual page mô tả cung cấp như sau:

Đây là giống như biên dịch, nhưng cho biết bạn mong đợi JDK hoặc một thùng chứa để cung cấp sự phụ thuộc vào thời gian chạy. Ví dụ, khi xây dựng một ứng dụng web cho Java Enterprise Edition, bạn sẽ thiết lập sự phụ thuộc vào API Servlet và các API Java EE có liên quan đến phạm vi được cung cấp bởi vì thùng chứa web cung cấp các lớp đó. Phạm vi này chỉ có sẵn trên đường dẫn biên dịch và kiểm tra, và không phải là transitive.

Vì vậy, theo ý kiến ​​của tôi, việc sao chép phụ thuộc này không ảnh hưởng đến việc biên dịch.

Tác giả của nguyên mẫu muốn một số lý do để sao chép gói API Java EE 6 vào thư mục được xác nhận. Điều này có thể hữu ích nếu bạn quyết định khởi động máy chủ Jetty và thực hiện một số thử nghiệm trong "Giai đoạn thử nghiệm" (ví dụ với JUnit).

Nếu bạn không sử dụng - chỉ cần xóa nó.

+1

IMHO, câu trả lời này không giải quyết được vấn đề chính: "tại sao javaee-endorsed-api.jar được sao chép sang thư mục được xác nhận". –

14

[Tìm thấy trong vấn đề MARCHETYPES-35 qua nhìn vào source of the webapp-javaee6 archetype]

nền
Gói javax.annotation từ JSR 250: Chú thích chung là hiện nay không chỉ in Java EE mà còn in the JDK.

phiên bản sử dụng
JDK 6: Chú thích Common 1,0
Java EE 6: Chú thích Common 1.1
JDK 7: Chú thích Common 1.1
Java EE 7: Chú thích Common 1,2

Vấn đề
Khi biên soạn một dự án Java EE, các chú thích từ JDK được ưu tiên hơn các chú thích từ jar javaee-web-api. Khi một chú thích từ javaee-web-api định nghĩa một phần tử mới, trình biên dịch có thể không thấy nó và thất bại với một lỗi.

Ví dụ
Khi một 6 dự án Java EE sử dụng @Resource(lookup = "...") và được biên soạn với JDK 6, sẽ thật là thất bại.

Chú thích chung 1.1 introduces the new elementResource.lookup(). Nhưng thông thường trình biên dịch sẽ chỉ thấy chú thích Tài nguyên từ JDK 6 sử dụng Chú thích chung 1.0 without this element.

Giải pháp
Đã sử dụng đối số biên dịch <endorseddirs> như bạn mô tả. Để buộc trình biên dịch sử dụng phiên bản đúng của chú thích.

JAVA EE 7
Như tôi đã hiểu được changelog for Common Annotations 1.2 cho Java EE 7, không có yếu tố mới về chú thích. Vì vậy, trong thực tế có thể không có vấn đề như vậy với Java EE 7 và JDK 7.

Các vấn đề liên quan