2012-02-06 27 views
10

Tôi đã cố gắng để có được điều này để làm việc trong một thời bây giờ nhưng không có may mắn được nêu ra.Maven - Sử dụng JDK 7 để biên dịch cho JVM 5

Tôi muốn chạy với JAVA_HOME trỏ đến JDK7 nhưng tôi muốn biên dịch một dự án cho JVM 5. Tôi đã đọc qua documentation, tôi đã tìm thấy similar posts trên SO, nhưng không ai trong số họ có vẻ hoạt động trong thiết lập của tôi.

đầu tiên tôi thử với chỉ đặt targetsource nhưng tôi đã nhận ra lỗi:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.5</source> 
     <target>1.5</target> 
    </configuration> 
</plugin> 

[ClassName] is not abstract and does not override abstract method getParentLogger() in CommonDataSource

Theo như tôi hiểu lớp đó đã được cập nhật trong JDK 7 và phương pháp bổ sung mà là ném lỗi là vừa thêm. Tôi cần phải sử dụng thời gian chạy của JDK 5 có thực hiện cũ và tất cả mọi thứ sẽ làm việc tốt. Vì vậy, tôi làm điều này:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <verbose>true</verbose> 
     <source>1.5</source> 
     <target>1.5</target> 
     <compilerArguments> 
      <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar</bootclasspath> 
     </compilerArguments> 
    </configuration> 
</plugin> 

Tôi có JAVA5_HOME đặt đúng trên hệ thống của tôi, tôi có thể nhìn thấy nó tải các lớp học đúng trong nhật ký, nhưng tôi nhấn một lỗi:

[loading ZipFileIndexFileObject[c:\Program Files\Java\jdk1.5.0_22\jre\lib\rt.jar(*.class)]]
...
...
[ClassName] error: package javax.crypto does not exist

Đó là đủ công bằng , vì tôi không bao gồm jce.jar (lớp mã hóa) trong số bootclasspath. Mặc dù vậy, có một thứ khiến tôi lo lắng. Mặc dù bootclasspath chỉ chứa thời gian chạy Java 5, tôi có rất nhiều thư viện từ JRE7 trong đường dẫn lớp. Chúng không được chỉ định ở bất kỳ đâu.

[search path for class files: c:\Program Files (x86)\Java\jdk1.5.0_22\jre\lib\rt.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\dnsns.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\localedata.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunec.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunjce_provider.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunmscapi.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\zipfs.jar, ...]

Nếu tôi cố gắng và thêm jce.jar (từ JRE5), tôi nhận được trở lại các lỗi đầu tiên:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <verbose>true</verbose> 
     <source>1.5</source> 
     <target>1.5</target> 
     <compilerArguments> 
      <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jce.jar</bootclasspath> 
     </compilerArguments> 
    </configuration> 
</plugin> 

The type [ClassName] must implement the inherited abstract method CommonDataSource.getParentLogger()

Tôi cũng thấy không có dấu vết của rt.jar được nạp, nhưng tôi không nhận được lỗi java.lang không tìm thấy, do đó, có một số lớp đang được tải trên đường dẫn lớp.

Tôi sẽ sửa tạm thời bằng cách tạo tập lệnh theo lô ghi đè JAVA_HOME trước khi tạo và đặt lại sau, nhưng tôi thực sự muốn điều này được thực hiện đúng cách. Điều này không có vẻ như một trường hợp sử dụng cực đoan như vậy. :)

Tôi đang làm gì sai ở đây?

Trả lời

1

Bạn có thể sử dụng tùy chọn cấu hình bootclasspath trên maven-biên dịch-plugin nếu cần thiết:

<compilerArguments> 
    <bootclasspath>xxxxxxxxx</bootclasspath> 
</compilerArguments> 

Bạn có thể đọc thêm về nó here. Xem ghi chú trong ví dụ.

+1

Hãy xem ví dụ của tôi, tôi đang sử dụng theo cách đó nhưng nó không hoạt động nếu tôi chỉ định nhiều lọ. Tui bỏ lỡ điều gì vậy? –

3

Phiên bản Java trước, chúng tôi không đặc biệt giỏi hỗ trợ các phiên bản Java trước. Đối với Java 7 nó dường như tốt hơn nhiều.

Đây là chương trình cần biên dịch theo bất kỳ phiên bản nào.

public class Main { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
    } 
} 

$ javac -target 1.7 -source 1.7 Main.java 
$ javac -target 1.6 -source 1.6 Main.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
1 warning 
$ javac -Xbootclasspath:/usr/java/jdk1.6.0_29/jre/lib/rt.jar -target 1.6 -source 1.6 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.5.0_22/jre/lib/rt.jar -target 1.5 -source 1.5 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.4.0_30/jre/lib/rt.jar -target 1.4 -source 1.4 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.3.1_29/jre/lib/rt.jar -target 1.3 -source 1.3 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.2.2_017/jre/lib/rt.jar -target 1.2 -source 1.2 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.1 -source 1.2 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.1 -source 1.1 Main.java 
javac: invalid source release: 1.1 
Usage: javac 
use -help for a list of possible options 
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.0 -source 1.0 Main.java 
javac: invalid target release: 1.0 
Usage: javac 
use -help for a list of possible options 

Nếu cần biên dịch phiên bản Java trước, bạn cần cung cấp lớp khởi động, lý tưởng cho phiên bản Java bạn muốn biên dịch. Java 7 xuất hiện để có thể hỗ trợ tất cả các cách quay lại Java 1.2

+0

Ngay cả khi tôi sử dụng '' và ''? Tôi hiểu từ các tài liệu rằng đây là những gì họ phải làm - sản xuất mã tương thích với các JVM khác. –

+3

Bạn * có thể * biên dịch mã cho các JVM trước đó theo JDK mới nhất. Nó sẽ tạo ra mã byte thích hợp và ném các lỗi nếu bạn cố gắng sử dụng các cấu trúc ngôn ngữ không có sẵn trong JVM đích. Bạn chỉ cần sử dụng thận trọng hơn vì javac sẽ không ngăn cản bạn sử dụng các phương thức/lớp mới không có trong hệ thống tiêu chuẩn JVM cũ ... –

+0

@AlexCiminian Bạn đang sử dụng tùy chọn đúng, vấn đề là liệu 'javac của bạn 'hỗ trợ tùy chọn này. Java 5.0 & 6 rất nghèo khi biên dịch cho các phiên bản trước, tuy nhiên Java 7 xuất hiện để trả về Java 1.2 Nếu bạn sử dụng phiên bản cũ hơn của 'rt.jar', nó sẽ ngăn bạn sử dụng các phương thức/chức năng không tồn tại trong phiên bản đích của bạn. –

1

Vấn đề là với khả năng tương thích ngược của Java 7.

Có rất ít lớp không bảo toàn tính tương thích ngược do không thể giải quyết các vấn đề có tính chất khác nhau, DataSource xảy ra là một trong số chúng.

Vì vậy, hoặc là bạn thích nghi với lớp học của bạn để tôn trọng chữ ký mới (ngay cả khi ở chế độ tương thích ngược), hoặc bạn sẽ bị buộc phải sử dụng một phiên bản khác của máy ảo.

Bạn có thể đọc thêm thông tin ở đây: http://www.oracle.com/technetwork/java/javase/compatibility-417013.html

1

Để sử dụng nhiều Chum trong các tùy chọn biên dịch Maven, sử dụng chuỗi $ {} path.separator giữa các lọ:

<compilerArguments> 
    <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jce.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jsse.jar</bootclasspath> 
</compilerArguments> 
+1

Nếu bạn nhìn vào ví dụ của tôi, đây là những gì tôi đang làm. –

5

Câu trả lời này được nhắm mục tiêu vào tiêu đề của câu hỏi, chứ không phải cho các vấn đề cụ thể của câu hỏi cụ thể.

Tôi đã kết thúc bằng cách sử dụng giải pháp này trong dự án của mình, cho phép tôi sử dụng đường dẫn lớp tùy chọn bootstrap tùy chọn bằng cách kích hoạt cấu hình maven. Tôi khuyên bạn nên sử dụng một hồ sơ cho điều này, bởi vì nếu không nó làm cho việc xây dựng thất bại cho bất cứ ai không có bộ biến môi trường (rất xấu, đặc biệt là cho một dự án mã nguồn mở). Tôi chỉ kích hoạt cấu hình này trong IDE của tôi cho hành động "Clean & Build".

<profile> 
     <id>compileWithJava5</id> 
     <!-- 
      NOTE 
      Make sure to set the environment variable JAVA5_HOME 
      to your JDK 1.5 HOME when using this profile. 
     --> 
     <properties> 
      <java.5.home>${env.JAVA5_HOME}</java.5.home> 
      <java.5.libs>${java.5.home}/jre/lib</java.5.libs> 
      <java.5.bootclasspath>${java.5.libs}/rt.jar${path.separator}${java.5.libs}/jce.jar</java.5.bootclasspath> 
     </properties> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <configuration> 
         <source>1.5</source> 
         <target>1.5</target> 
         <compilerArguments> 
          <bootclasspath>${java.5.bootclasspath}</bootclasspath> 
         </compilerArguments> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
Các vấn đề liên quan