2014-10-25 16 views
10

tôi phát triển và xây dựng ứng dụng Java của tôi sử dụng Maven. Tôi cần phải hỗ trợ Java 1.6, vì vậy tôi sử dụng các thuộc tính sau:Phiên bản Java phụ thuộc của Maven Dependency?

<maven.compiler.target>1.6</maven.compiler.target> 
<maven.compiler.source>1.6</maven.compiler.source> 

Tuy nhiên, khi tôi chạy các ứng dụng tôi nhận được một thông báo lỗi "không được hỗ trợ MAJOR.MINOR phiên bản" và tôi nghi ngờ rằng một trong những lọ phụ thuộc của tôi được biên soạn với phiên bản Java mới hơn phiên bản Java tôi cần hỗ trợ.

Câu hỏi của tôi:

  1. Đây có phải là thậm chí có thể? Tôi nghĩ Maven sẽ chăm sóc loại vấn đề phụ thuộc này.

  2. Có một cách dễ dàng để tìm ra phiên bản lớn/nhỏ của tất cả các phụ thuộc của tôi? (Sẽ là tuyệt vời nếu nó có thể được hiển thị khi thực hiện mvn dependency:tree ví dụ.)

+0

Bạn có thể đăng toàn bộ tệp maven của mình không? –

+0

Có một số nội dung tôi không muốn tiết lộ về SO trong đó, chẳng hạn như thông tin chứng chỉ. Nhưng đây là phiên bản rút gọn của các phần liên quan: http://pastebin.com/BE7yDbSV – aioobe

+3

Có vẻ như Jersey 2.6 là phiên bản cuối cùng được biên dịch trong java 6. Sau đó là java 7. Tham khảo: https: // jersey .java.net/documentation/latest/modules-and-dependencies.html –

Trả lời

13

Vấn đề là mọi phụ thuộc (người duy trì) có thể tự quyết định phiên bản java nào được sử dụng để biên dịch (1.5, 1.6, 1.7, 1.8, v.v.) nên không thể giải quyết được thông qua Maven. Nhưng bạn có thể chắc chắn rằng bạn không sử dụng các phụ thuộc đang sử dụng một phiên bản Java khác với bạn muốn có.

này có thể được enfored bằng cách sử dụng Maven Enforcer Plugin bằng cách sử dụng extra-enforcer-rules:

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-enforcer-plugin</artifactId> 
     <version>1.4.1</version> <!-- find the latest version at http://maven.apache.org/plugins/maven-enforcer-plugin/ --> 
     <executions> 
      <execution> 
      <id>enforce-bytecode-version</id> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
      <configuration> 
       <rules> 
       <enforceBytecodeVersion> 
        <maxJdkVersion>1.6</maxJdkVersion> 
        <excludes> 
        <exclude>org.mindrot:jbcrypt</exclude> 
        </excludes> 
       </enforceBytecodeVersion> 
       </rules> 
       <fail>true</fail> 
      </configuration> 
      </execution> 
     </executions> 
     <dependencies> 
      <dependency> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>extra-enforcer-rules</artifactId> 
      <version>1.0-beta-5</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 

này sẽ phá vỡ xây dựng của bạn nếu bạn có một sự phụ thuộc đó được biên dịch với một phiên bản khác của JDK hơn bạn muốn có.

+1

Thật gọn gàng. Tôi cho rằng các quy tắc này cũng được áp dụng cho các phụ thuộc transitive? –

+2

Trích từ tài liệu: 'Quy tắc này kiểm tra các phụ thuộc quá mức và không thành công nếu bất kỳ lớp nào của bất kỳ phụ thuộc nào có phiên bản bytecode của nó cao hơn phiên bản được chỉ định.' Xem http://mojo.codehaus.org/extra-enforcer-rules/ enforceBytecodeVersion.html – khmarbaise

+2

Hãy cho tôi một số googling để đến đây. Nhiều đánh giá cao. – OliverS

0

Để trả lời hai câu hỏi của bạn:

Vâng, đây là có thể. Nhìn vào số docs, các thuộc tính <maven.compiler.target><maven.compiler.source> chỉ cần cho Maven biết phiên bản javac nào để sử dụng để biên dịch dự án của bạn. Và tôi trích dẫn, để bạn tham khảo:

Lưu ý: Chỉ thiết lập các mục tiêu tùy chọn không đảm bảo rằng mã của bạn thực sự chạy trên một JRE với phiên bản cụ thể. Các pitfall là sử dụng ngoài ý muốn của các API mà chỉ tồn tại trong JRE sau đó sẽ làm cho mã của bạn thất bại khi chạy với một lỗi liên kết. Để tránh vấn đề này, bạn có thể cấu hình classpath khởi động của trình biên dịch để phù hợp với JRE mục tiêu hoặc sử dụng các vật Sniffer Maven Plugin để xác minh mã của bạn không sử dụng các API ngoài ý muốn.

Các magic number sau khi lỗi Unsupported major.minor version thực sự nói với phiên bản của JRE tập tin lớp tương thích với:

J2SE 8 = 52, 
J2SE 7 = 51, 
J2SE 6.0 = 50, 
J2SE 5.0 = 49, 
JDK 1.4 = 48, 
JDK 1.3 = 47, 
JDK 1.2 = 46, 
JDK 1.1 = 45 

Tôi không biết nếu có một cách dễ dàng để kể lớn/nhỏ phiên bản của tất cả các phụ thuộc (và phụ thuộc transitive) trong một dự án mặc dù.

CẬP NHẬT: Mặc dù tôi chưa từng sử dụng nó trước đây, tôi tự hỏi Animal Sniffer Maven plugin sẽ giúp bạn tìm ra phiên bản chính/phụ của phụ thuộc của bạn.

+1

Thật không may, sniffer động vật chỉ dành cho mã viết của riêng bạn chứ không phải cho các phụ thuộc. Dựa trên điều mà một phụ thuộc trong Maven là một tạo phẩm nhị phân đã được biên dịch với bất kỳ phiên bản nào bạn không thể thiết lập phiên bản trình biên dịch trong bản dựng của bạn để ép buộc các phiên bản của các phụ thuộc. – khmarbaise

+0

Điều đó rất hữu ích. Tôi vẫn nhận được một upvote? :) –

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