Maven에서 사용할 JDK 지정


141

내가 수정 한 Hudson 플러그인을 만들려고하는데 jdk1.6이 필요합니다. 이것은 괜찮지 만 다른 jdk가 어디에 있는지 maven에게 어떻게 알 수 있는지 알 수 없습니다. 인터넷에서 언급이 적었지만 나에게는 적용되지 않는 것 같습니다. 일부는 일부 구성을 추가하는 것이 .m2/settings.xml좋지만에 없습니다 settings.xml. 또한 모든 메이븐 빌드에 1.6을 사용하고 싶지 않습니다.

하나의 꼬임은 mvncygwin에서 사용 하고 있다는 것입니다. 프로젝트 pom 파일에서 사양을 만들 수 있어야하지만 기존 pom은 거의 없습니다.

결론은 maven의 단일 호출에 대해 jdk를 지정하는 방법이 있습니까?

답변:


142

결론은 maven의 단일 호출에 대해 jdk를 지정하는 방법이 있습니까?

JAVA_HOME환경 변수 의 값을 임시로 변경하십시오 .


10
Windows의 예 :set JAVA_HOME="C:\Java\jdk7"
acdcjunior

6
루 분투에서 : JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /"mvn -v
Enrique San Martín

8
그리고 다른 누군가가 왜 그것을 바꿀 수 없는지 궁금해하고 나이를 쓰는 경우 : JAVA_HOME이 파일에서 Maven (최소한 Mac에서는)으로 설정할 수 있습니다 : /private/etc/mavenrc -다음과 같은 것을 사용할 수 있습니다 :export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti

3
유닉스 : export JAVA_HOME='D:/dev/java/jdk8/jre'(나를 위해
일함

2
JAVA_HOME을 변경 한 다음 java -version계속하면 여전히 이전 버전을 인쇄합니다.
ocramot

82

maven이 이제 해결책을 제시 한 것 같습니다 : 다른 JDK를 사용하여 소스 컴파일

JAVA_HOMEJDK7 (maven 프로세스를 실행할 것)을 지적 한다고 가정 해 봅시다.

당신 pom.xml은 될 수 있습니다 :

<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>

개발자가에 다음 행을 추가하고 사용자 정의하면 settings.xmlpom은 플랫폼에 독립적입니다.

<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
투표했습니다! 내가 사용할 수 있습니다 발견 -Dmaven.compiler.fork=true-Dmaven.compiler.executable=/path/to/target/javac명령 줄에서.
Jin Kwon

이러한 java-opts를 사용하더라도 컴파일러 플러그인 <executable> $ {maven.compiler. executable} </ executable>에 추가해야합니다.
Paul Gregoire

2
@JinKwon 컴파일러 플러그인 섹션에서 정의하지 않아도 -D 옵션을 전달하면 제대로 작동합니다. 이것은 가끔 사용하거나 스크립팅에 좋습니다. 투표 할 수 있도록 별도의 답변으로 작성해야합니다!
Gaëtan Lehmann

Java 8에서 테스트를 실행하려고 할 때이 솔루션이 실패했습니다. * 지원되지 않는 major.minor 버전 52.0 *
edwin

39

compile : compile 에는 경로를 지정할 수 있는 사용자 속성 이 있습니다 javac.

때이 사용자 속성 만 작동합니다 fork입니다 true이다 false기본적으로.

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

공백이 있으면 값을 큰 따옴표로 묶어야 할 수도 있습니다.

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

Maven 사용자 정의 특성 우선 순위 도 참조하십시오 .


JAVA_HOME변수 를 덮어 써야했습니다. 예를 들어 (bash 쉘에서)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

"플러스, 모든 maven 빌드에 1.6을 사용하고 싶지 않습니다."라고 말했듯이 .... pom 파일을 수정하고 사용할 jdk 버전을 지정하는 것이 좋습니다.

<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>

특정 프로젝트가 해당 버전의 jdk를 사용하는지 확인합니다.


6
이것은 시작에 불과하지만 해결책은 아닙니다. 이것은 maven 컴파일러 플러그인이 1.7을 위해 컴파일하기위한 요구 사항입니다. 그리고 그 트릭은 maven을 1.7로 컴파일 할 수있게 만드는 것입니다. 현재 자바 버전이 다르면 그리 간단하지 않습니다.
Sergey Ushakov


14

JAVA_HOMEPascal과 같은 환경 변수 를 설정한다고 말합니다 . Cygwin에서 bash를 쉘로 사용하면 다음과 같아야합니다.

export JAVA_HOME=/cygdrive/c/pathtothejdk

Java 디렉토리 경로를 환경 변수 앞에 추가해도 다음과 같이 손상되지 않습니다 .binPATH

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

또한 maven-enforce-plugin올바른 JDK가 사용되도록 추가 하십시오. 이것은 당신의 치어에 대한 좋은 연습입니다.

<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>

Maven Enforcer 플러그인 – 사용법을 참조하십시오 .


1
이것은 JDK 의 정확한 버전 을 지정하기에 완벽했습니다 . 예를 들어 초기 JDK 1.8을 사용할 때 실패하는 프로젝트가 있지만 JDK 1.8.0_77을 사용하면 제대로 작동합니다. 두 JDK를 모두 설치 했으며이 솔루션으로 maven은 특정 1.8.0_77 폴더를 대상으로 JAVA_HOME 경로를 변경할 때까지 잘못된 버전 1.8을 사용하고 있다고 말했습니다. 다른 답변으로는 버전에 대해 세분화 할 수 없었습니다.
bojingo

13

나는 오래된 실을 알고 있습니다. 그러나 Maven for Java 8 컴파일러 소스에서 이와 비슷한 문제가 발생했습니다. 나는 이 기사 에서 언급 한 빠른 수정으로 이것을 알아 냈고 여기에 넣을 수 있고 다른 사람들을 도울 수 있다고 생각했습니다.

<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
이 줄을 추가 한 후 Maven 업데이트가 필요할 수 있습니다 (Eclipse : 프로젝트, Maven, Update 프로젝트를 마우스 오른쪽 단추로 클릭하십시오)
Romano

maven.compiler 속성을 설정해도 코드가 Java 11에 추가 된 메소드를 사용하지 못하게됩니다. 예를 들어 String.repeat (). 이 받는다는 그래서 JDK (11)와 함께 구축 할 때 빌드하지만 난 그게 실패 할
엔리코 Giurin에게

6

Maven은 변수 $ JAVACMD를 최종 java 명령으로 사용하고 java 실행 파일이 maven을 다른 JDK로 전환 할 위치로 설정합니다.


고마워 친구, 우리는 10 시간을 보낸 후 귀하의 답변의 도움으로 해결했습니다.
Mukul_3062

3

Hudson은 또한 여러 Java 런타임을 정의 할 수 있으며 이들 중 하나를 사용하여 Maven을 호출 할 수 있습니다. 구성 페이지를 자세히 살펴보십시오.


OP는 hudson이 아닌 명령 줄에 hudson 플러그인을 작성하고 있습니다 (적어도 이것은 내 이해입니다).
Pascal Thivent

3

당신은을 통해 자바를 설치 한 경우 brewMac다음 기회는 당신이 여기에 자바 홈 디렉터리를 찾을 수 있습니다 :

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

다음 단계 Java Home는 maven이 가리키는 디렉토리 를 찾는 것 입니다. 명령을 입력하려면 다음을 입력하십시오.
mvn -version

여기에 이미지 설명을 입력하십시오

우리가 관심있는 분야는 다음 Java version과 같습니다 runtime.

Maven은 현재를 가리키고 Java 13있습니다. 또한 주요 런타임에서 Java Home 경로를 볼 수 있습니다. 즉
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

, maven의 Java 버전을 변경하려면 env 변수에 Java 8홈 경로를 추가해야 JAVA_HOME합니다.

그렇게하려면
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 터미널에서 다음 명령을 실행해야합니다 .

이제 maven 버전을 확인하면 Java 8을 가리키고 있음을 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

이 문제는 새 터미널에서 maven 버전을 다시 확인하면 Java 13을 가리키고 있음을 알 수 있습니다.이를 피하기 위해 파일에 JAVA_HOME변수를 추가하는 것이 좋습니다 ~/.profile.

이 방법으로 터미널을로드 할 때마다 기본적으로 JAVA_HOME에 정의한 값이 사용됩니다. ~/.profile파일 에 추가해야하는 행입니다 .
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

새 터미널을 열고 Maven 버전 ( mvn -version)을 확인할 수 있으며 이번에는 Java 8을 가리키고 있습니다.


0

Windows 7의 Eclipse 내에서 maven으로 빌드 문제가있었습니다.

mvn 빌드가 명령 줄에서 제대로 실행되는 것을 관찰했지만.

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

Eclipse는 JDK 대신 JRE 설치를 기본 JVM으로 고려하여 컴파일에 실패했습니다.

다음 줄에 eclipse.ini를 추가했습니다.

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

또한 일식에서 시작할 때 다음 목록의 "목표"섹션에서 사용했습니다.

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

컴파일 오류가 해결되었습니다.


0

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

여러 jdk 버전을 관리하는 또 다른 대안은 jEnv입니다.

설치 후 다음과 같이 Java 버전을 "로컬로"즉, 특정 프로젝트 디렉토리에 대해 간단히 변경할 수 있습니다.

jenv local 1.6

이것은 또한 mvn 플러그인을 활성화 할 때 mvn이 해당 버전을 로컬에서 사용하게합니다.

jenv enable-plugin maven

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.