Chỉ định JDK cho Maven để sử dụng


141

Tôi đang cố gắng xây dựng một plugin Hudson tôi đã sửa đổi và nó yêu cầu jdk1.6. Điều này là tốt, nhưng tôi không thấy làm thế nào tôi có thể nói với maven nơi jdk khác nhau. Tôi đã tìm thấy một vài đề cập trên internet nhưng dường như chúng không áp dụng cho tôi. Một số đề nghị thêm một số cấu hình vào .m2/settings.xmlnhưng tôi không có settings.xml. Ngoài ra, tôi không muốn sử dụng 1.6 cho tất cả các bản dựng maven.

Một điều khó khăn là tôi đang sử dụng mvntrong cygwin, nếu điều đó quan trọng. Dường như tôi có thể tạo đặc tả trong tệp pom dự án, nhưng pom hiện có khá trống.

Vì vậy, điểm mấu chốt là, có cách nào để xác định jdk cho một lần gọi maven không?

Câu trả lời:


142

Vì vậy, điểm mấu chốt là, có cách nào để xác định jdk cho một lần gọi maven không?

Tạm thời thay đổi giá trị của JAVA_HOMEbiến môi trường của bạn .


10
Ví dụ trong windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
trong Lubfox: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín

8
Và trong trường hợp bất kỳ ai khác quên và dành nhiều lứa tuổi tự hỏi tại sao họ không thể thay đổi nó: JAVA_HOMEcó thể được đặt cho Maven (ít nhất là trên Mac) trong tệp này: /private/etc/mavenrc - Và điều đó có thể sử dụng một cái gì đó như (lưu ý các backticks không phải dấu ngoặc đơn!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(làm việc cho tôi)
Barshe Roussy

2
nếu tôi thay đổi JAVA_HOME và sau đó tôi làm java -version, nó vẫn in phiên bản trước.
ocramot

82

Có vẻ như maven hiện đưa ra một giải pháp ở đây: Biên dịch các nguồn bằng cách sử dụng JDK khác

Giả sử JAVA_HOMEđiểm của bạn đến JDK7 (sẽ chạy các quy trình maven)

Bạn pom.xmlcó thể là:

<build>
    <plugins>
        <!-- we want JDK 1.6 source and binary compatiblility -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- ... -->
        <!-- we want sources to be processed by a specific 1.6 javac -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <verbose>true</verbose>
              <fork>true</fork>
              <executable>${JAVA_1_6_HOME}/bin/javac</executable>
              <compilerVersion>1.3</compilerVersion>
            </configuration>
        </plugin>
    </plugins>
</build>

Nếu các nhà phát triển của bạn chỉ cần thêm (và tùy chỉnh) các dòng sau trong họ settings.xml, pom của bạn sẽ độc lập với nền tảng:

<settings>
  [...]
  <profiles>
    [...]
    <profile>
      <id>compiler</id>
        <properties>
          <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
          <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
        </properties>
    </profile>
  </profiles>
  [...]
  <activeProfiles>
    <activeProfile>compiler</activeProfile>
  </activeProfiles>
</settings>

18
Bỏ phiếu lên! Tôi tìm thấy tôi có thể sử dụng -Dmaven.compiler.fork=true-Dmaven.compiler.executable=/path/to/target/javactrong dòng lệnh.
Jin Kwon

ngay cả khi sử dụng các opts java đó, bạn vẫn phải thêm phần mềm này vào plugin trình biên dịch <execable> $ {maven.compiler.executable} </ execable>
Paul Gregoire

2
@JinKwon Các tùy chọn chuyển với -D hoạt động tốt, ngay cả khi không xác định nó trong phần plugin trình biên dịch. Điều này là tốt để sử dụng thường xuyên hoặc cho kịch bản. Bạn nên đặt nó trong một câu trả lời riêng biệt để chúng tôi có thể bỏ phiếu!
Gaëtan Lehmann

Giải pháp này thất bại khi tôi thử chạy thử nghiệm trong Java 8 Tôi đã nhận được * Không được hỗ trợ Major.minor phiên bản 52.0 *
edwin

39

compile: compilemột thuộc tính người dùng cho phép bạn chỉ định một đường dẫn đến javac.

Lưu ý rằng tài sản của thành viên này chỉ hoạt động khi forktrueđó là falsetheo mặc định.

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile

Bạn có thể phải trích dẫn gấp đôi giá trị nếu nó chứa khoảng trắng.

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile

Xem thêm ưu tiên thuộc tính tùy chỉnh Maven .


Tôi cũng cần ghi đè lên JAVA_HOMEbiến của mình . Ví dụ: (bash shell):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
Enrique S. Filiage

24

Như bạn đã nói "Plus, tôi không muốn sử dụng 1.6 cho tất cả các bản dựng maven." .... Vì vậy, tốt hơn tôi sẽ nói sửa đổi tệp pom của bạn và chỉ định phiên bản jdk nào sẽ sử dụng.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.9</source>
                <target>1.9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Nó sẽ đảm bảo rằng dự án cụ thể của bạn sử dụng phiên bản jdk đó.


6
Đây chỉ là điểm khởi đầu, nhưng không phải là giải pháp. Đây là yêu cầu cho plugin trình biên dịch maven để biên dịch cho 1.7. Và mẹo nhỏ là làm cho maven thực sự có khả năng biên dịch cho 1.7, điều này không quá tầm thường nếu phiên bản java hiện tại của bạn khác ...
Sergey Ushakov

Đó là một câu hỏi khác stackoverflow.com/questions/16723533/
Kẻ

14

Tôi nói bạn thiết lập JAVA_HOMEbiến môi trường như Pascal đang nói: Trong Cygwin nếu bạn sử dụng bash làm shell của bạn sẽ là:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Nó cũng không bao giờ gây hại cho việc thêmbin đường dẫn thư mục java vào PATHbiến môi trường với:

export PATH=${JAVA_HOME}/bin:${PATH}

Đồng thời thêm maven-enforce-pluginđể đảm bảo JDK đúng được sử dụng. Đây là một thực hành tốt cho pom của bạn.

<build>
 <plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <executions>
        <execution>
          <id>enforce-versions</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <requireJavaVersion>
                <version>1.6</version>
              </requireJavaVersion>
            </rules>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Vui lòng xem plugin Maven Enforcer - Cách sử dụng .


1
Điều này là hoàn hảo để chỉ định phiên bản chính xác của JDK. Ví dụ, tôi có một dự án thất bại khi sử dụng JDK 1.8 ban đầu, nhưng nếu sử dụng JDK 1.8.0_77, nó hoạt động tốt. Tôi đã cài đặt cả hai JDK và với giải pháp này, maven nói với tôi rằng tôi đang sử dụng phiên bản 1.8 sai cho đến khi tôi thay đổi đường dẫn JAVA_HOME của mình để nhắm mục tiêu thư mục 1.8.0_77 cụ thể. Các câu trả lời khác không cho phép bạn quá chi tiết trên phiên bản.
bojingo 30/03/2016

13

Tôi biết một chủ đề cũ. Nhưng tôi đã gặp một số vấn đề với một cái gì đó tương tự như trong Maven cho nguồn trình biên dịch Java 8. Tôi đã tìm ra điều này với một sửa chữa nhanh được đề cập trong bài viết này nghĩ rằng tôi có thể đặt nó ở đây và có thể có thể giúp đỡ người khác:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

1
Có thể cần có Cập nhật Maven sau khi thêm các dòng này (Eclipse: Nhấp chuột phải vào dự án, Maven, Dự án cập nhật)
Romano

Việc đặt các thuộc tính maven.compiler không ngăn mã sử dụng các phương thức được thêm vào trong java 11. Đối với các trường hợp String.repeat (). Điều này khi xây dựng với jdk 11. Vì vậy, maven xây dựng nhưng tôi ước nó sẽ thất bại
Enrico Giurin

6

Maven sử dụng biến $ JAVACMD làm lệnh java cuối cùng, đặt nó vào nơi thực thi java sẽ chuyển maven sang JDK khác.


Cảm ơn bạn, sau khi dành 10 giờ, chúng tôi đã sửa chữa với sự giúp đỡ của câu trả lời của bạn.
Mukul_3062

3

Hudson cũng cho phép bạn định nghĩa một số thời gian chạy Java và cho phép bạn gọi Maven bằng một trong số này. Có một cái nhìn gần hơn trên trang cấu hình.


OP đang xây dựng một plugin hudson trên dòng lệnh, không phải dưới hudson (ít nhất, đây là sự hiểu biết của tôi).
Pascal Thivent

3

Nếu bạn đã cài đặt Java thông qua brewtrong Macsau đó rất có thể là bạn sẽ tìm thấy Java Home Directory của bạn ở đây:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Bước tiếp theo bây giờ sẽ là tìm Java Homethư mục mà maven đang trỏ tới. Để tìm nó gõ lệnh:
mvn -version

nhập mô tả hình ảnh ở đây

Các lĩnh vực chúng tôi quan tâm ở đây là: Java versionruntime.

Maven hiện đang chỉ vào Java 13. Ngoài ra, bạn có thể thấy đường dẫn Java Home trong thời gian chạy chính, đó là:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Để thay đổi phiên bản Java của maven, chúng ta cần thêm Java 8đường dẫn home vào JAVA_HOMEbiến env.

Để làm điều đó chúng ta cần chạy lệnh:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home trong terminal.

Bây giờ nếu chúng ta kiểm tra phiên bản maven, chúng ta có thể thấy rằng nó đang trỏ đến Java 8 ngay bây giờ.

nhập mô tả hình ảnh ở đây

Vấn đề với điều này là nếu bạn kiểm tra lại phiên bản maven trong thiết bị đầu cuối mới, bạn sẽ thấy rằng nó đang trỏ đến Java 13. Để tránh điều này, tôi khuyên bạn nên thêm JAVA_HOMEbiến trong ~/.profiletệp.

Bằng cách này bất cứ khi nào thiết bị đầu cuối của bạn đang tải, nó sẽ chiếm giá trị bạn đã xác định trong JAVA_HOME theo mặc định. Đây là dòng bạn cần thêm vào trong ~/.profiletệp:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Bạn có thể mở một thiết bị đầu cuối mới và kiểm tra phiên bản Maven, ( mvn -version) và bạn sẽ thấy nó đang trỏ đến Java 8 lần này.


0

Tôi đã gặp vấn đề với maven trong Eclipse trên Windows 7.

Mặc dù tôi quan sát thấy mvn build đã chạy tốt từ dòng lệnh.

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml   > output.log

Eclipse đã xem xét như là một JVM mặc định, cài đặt JRE thay vì JDK, vì vậy nó đã thất bại trong quá trình biên dịch.

Tôi đã thêm vào dòng eclipse.ini sau:

-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin

Ngoài ra khi bắt đầu từ nhật thực, tôi đã sử dụng trong phần "Mục tiêu" sau đây:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml

Lỗi biên dịch đã được giải quyết.


0

Đối với Java 9:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

0

Một cách khác để quản lý nhiều phiên bản jdk là jEnv

Sau khi cài đặt, bạn chỉ cần thay đổi phiên bản java "cục bộ" tức là cho một thư mục dự án cụ thể bằng cách:

jenv local 1.6

Điều này cũng sẽ khiến mvn sử dụng phiên bản đó cục bộ, khi bạn kích hoạt plugin mvn:

jenv enable-plugin maven

0

Bạn cũng có thể đặt JDK cho Maven trong một tệp trong thư mục chính của bạn ~/.mavenrc:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

Biến môi trường này sẽ được kiểm tra bởi tập lệnh mvn và được sử dụng khi có mặt:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc

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.