런타임시 Java 버전 가져 오기


128

1.6에서 수정 된 JDK 1.5의 Java 버그를 해결해야합니다. 다음 조건을 사용하고 있습니다.

if (System.getProperty("java.version").startsWith("1.5.")) {
    ...
} else {
    ...
}

다른 JVM에서도 작동합니까? 이것을 확인하는 더 좋은 방법이 있습니까?

답변:


41

이 기사는 확인 1.5하거나1.6 에서는 올바른 버전 이름 지정 규칙을 따르므로 접두어가 작동해야한다고 .

썬 기술 기사


1
Oracle인지 Open인지 알 수있는 방법이 있습니까?
Joe C

89

java.version모든 JVM에 존재 하는 시스템 특성 입니다. 두 가지 가능한 형식이 있습니다.

  • 자바 8 이하 : 1.6.0_23, 1.7.0, 1.7.0_80,1.8.0_211
  • 자바 9 이상 : 9.0.1, 11.0.4, 12,12.0.1

다음은 주 버전을 추출하는 요령입니다. 1.x.y_z버전 문자열 인 경우 문자열의 인덱스 2에서 문자를 추출하십시오. 그것은 경우 x.y.z버전 문자열이 존재하는 경우, 최초의 도트 문자로 문자열을 잘라.

private static int getVersion() {
    String version = System.getProperty("java.version");
    if(version.startsWith("1.")) {
        version = version.substring(2, 3);
    } else {
        int dot = version.indexOf(".");
        if(dot != -1) { version = version.substring(0, dot); }
    } return Integer.parseInt(version);
}

이제 버전을 훨씬 더 편안하게 확인할 수 있습니다.

if(getVersion() < 6) {
    // ...
}

7
1.5는 괜찮지 만 1.6은 부동 소수점 숫자로 정확하지 않습니다.
하.

1
FP 정밀도는 제쳐두고 OP의 요구에 따라 제공된 코드는> =가 아닌 (버전> 1.5) 여야합니다. OP로 : 현재 문자열 비교를 사용하는 경우 1.5 미만도 확인해야합니까?
Steven Mackenzie

1
@Ha : 어쩌면하지만 double version = 1.6하고 Double.parseDouble("1.6")여전히 오른쪽 같은 비트 패턴을 양보해야합니까? 우리는 숫자에 대한 산술을하지 않기 때문에 (단순 비교 만), ==조차도 예상대로 작동합니다.
Aaron Digulla

1
그러나 곧 우리는 1.1 버전을 다시 갖게 될 것입니다. 또는 1.10 대신에 우리는 2.0 [:-)로 시작합니다
user85421

7
Java 9에서는 "1"이 없습니다. 앞에. 문자열은 "9 ..."로 시작합니다
Dave C

59

패키지 메타 정보에서 버전을 얻는 방법은 무엇입니까?

String version = Runtime.class.getPackage().getImplementationVersion();

다음과 같은 것을 인쇄합니다.

1.7.0_13


9
와우, 그런 종류의 내 마음을 불었다. 내 경우, 모든 내가 원하는하지만 너무 버전의 첫 번째 두 부분이었다Runtime.class.getPackage().getSpecificationVersion()
웨슬리 하트 포드

8
Runtime.class.getPackage().getImplementationVersion()nullJDK9 에서 돌아 오는 것 같습니다 .
tresf

MANIFEST.MF에 정의 된 경우에만 작동합니까?
Aaron Digulla

30

Runtime.version()

자바 9 때문에, 당신은 사용할 수 있습니다 Runtime.version()반환, Runtime.Version:

Runtime.Version version = Runtime.version();

echo "System.err.print (Runtime.version (). major ())"| $ JDK / bin / jshell 2> & 1> / dev / null
judovana

29

가장 간단한 방법 ( java.specification.version ) :

double version = Double.parseDouble(System.getProperty("java.specification.version"));

if (version == 1.5) {
    // 1.5 specific code
} else {
    // ...
}

또는 ( java.version ) 과 같은 것 :

String[] javaVersionElements = System.getProperty("java.version").split("\\.");

int major = Integer.parseInt(javaVersionElements[1]);

if (major == 5) {
    // 1.5 specific code
} else {
    // ...
}

또는 모든 것을 분리하려면 ( java.runtime.version ) :

String discard, major, minor, update, build;

String[] javaVersionElements = System.getProperty("java.runtime.version").split("\\.|_|-b");

discard = javaVersionElements[0];
major   = javaVersionElements[1];
minor   = javaVersionElements[2];
update  = javaVersionElements[3];
build   = javaVersionElements[4];

11

Java 9 이상에서는 명명 규칙이 다릅니다. 보다는을 System.getProperty("java.version")반환합니다 ."9""1.9"


8

작동하지 않으면 --pos이중으로 평가 해야 합니다.

    String version = System.getProperty("java.version");
    System.out.println("version:" + version);
    int pos = 0, count = 0;
    for (; pos < version.length() && count < 2; pos++) {
        if (version.charAt(pos) == '.') {
            count++;
        }
    }

    --pos; //EVALUATE double

    double dversion = Double.parseDouble(version.substring(0, pos));
    System.out.println("dversion:" + dversion);
    return dversion;
}

7

Apache Commons Lang의 예 :

import org.apache.commons.lang.SystemUtils;

    Float version = SystemUtils.JAVA_VERSION_FLOAT;

    if (version < 1.4f) { 
        // legacy
    } else if (SystemUtils.IS_JAVA_1_5) {
        // 1.5 specific code
    } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) {
        // 1.6 compatible code
    } else {
        // dodgy clause to catch 1.4 :)
    }

1
version < 1.4f... 언제 발생 version = 1.4f합니까?
ADTC

아 네, 맞습니다-위의 예에서 1.4f는 캡처되지 않습니다. 이 예는 : 자바의 속성에 대한 대안으로 아파치 코 몬즈 랭의 상수를 시연
mvanle

대답을 편집하고.로 변경할 수 있습니다 version <= 1.4f. 불행히도 방법을 SystemUtils제공하지 않지만 isJavaVersionLessThan(다행히도) 레거시 코드를 else블록 에 넣을 수 있습니다 .
ADTC September

오류 ... "1.4를 잡으려는 dodgy 절" ? 안 1.4f레거시 코드로 후퇴?
ADTC September

2
나는 제안 할 것이다 : if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }. 위의 특정 코드, 아래의 일반 코드, 맨 아래의 대체 코드
ADTC September

5

JOSM 의 구현은 다음과 같습니다 .

/**
 * Returns the Java version as an int value.
 * @return the Java version as an int value (8, 9, etc.)
 * @since 12130
 */
public static int getJavaVersion() {
    String version = System.getProperty("java.version");
    if (version.startsWith("1.")) {
        version = version.substring(2);
    }
    // Allow these formats:
    // 1.8.0_72-ea
    // 9-ea
    // 9
    // 9.0.1
    int dotPos = version.indexOf('.');
    int dashPos = version.indexOf('-');
    return Integer.parseInt(version.substring(0,
            dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : 1));
}

4

apache utils에 종속 될 수있는 경우 org.apache.commons.lang3.SystemUtils를 사용할 수 있습니다.

    System.out.println("Is Java version at least 1.8: " + SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));


1

@mvanle의 답변은 Scala로 변환되었습니다. scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

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