2009-11-10 2 views
3

1.5 및 1.6을 사용하여 컴파일 된 코드가 1.4 JRE에서 실행됩니까? 1.4 JRE가 지원하는 Java 버전이 확실하지 않았습니다.JRE 1.4는 Java 1.5 및 1.6으로 컴파일 된 클래스를 지원합니까?

해당 코드가 1.5 또는 1.6에서 지원하는 기능을 구현하는 경우 분명히 won't compile ... "후방 컴파일"을 사용하는 risks이 있지만 1.4JRE가로드를 거부하더라도 확실하지는 않습니다 1.5/1.6 컴파일 된 클래스 또는 아닙니다.


업데이트 : 나는 당신이 JRE 1.4에서 1.6 클래스 파일을 실행하면 사용자가 java.lang.UnsupportedClassVersionError 예외가 확인했다.

답변

4

기본값이 javac 인 1.6으로 빌드하면 클래스 파일이 이전 버전의 Java에서 작동하지 않습니다.

오래된 Java 용으로 컴파일하는 가장 좋은 방법은 older JDK releases을 사용하는 것입니다. ,

+3

Naw, 이전 Java 용으로 컴파일하는 가장 좋은 방법은 * 버그 * 및 성능 문제가 있으므로 이전 릴리스를 사용하지 않는 것입니다. 필자가 내 대답에서 공유 한 충고 - 항상 최신을 사용하고 크로스 컴파일에 대한 적절한 조언을 따르십시오 - Peter Von der Ahe, 최근까지 수년간 javac의 기술 책임자였습니다. –

+0

컴파일러에는 버그가 거의 없으므로 실제로 적합하지 않습니다. 또한 -target 스위치를 사용하더라도 1.4가 아닌 1.6에있는 메서드 호출 (예 : string.split())을 포함 할 수 있습니다. -target 스위치를 사용하지 않아도됩니다. 반면에 구형 JDK로 컴파일하면 JDK의 구형 버전이나 최신 버전에 대한 선호도가 떨어지지 않습니다. – AlBlue

+0

javac의 버그가 걱정된다면 언제나 ecj가 있습니다. –

0

나는 그렇게 생각하지 않는다.

간혹 (이유가 너무 복잡하기 때문에) 1.6 JDK에서 컴파일 된 1.5 JRE에서 코드를 실행하려고합니다. 일반적으로 java.lang.UnsupportedClassVersionError 예외가 발생합니다.

+1

이 대답은 많은 확신을줍니다. ;) –

+0

죄송합니다. 내가 편집 중이 었어. :) – Seth

+0

물론 위와 같이 이전 버전과의 호환성을 위해 명시 적으로 컴파일합니다. – Seth

5

스위치가 javac -target 1.4 인 경우에만 컴파일하십시오.

분명히 당신은 등 제네릭, 실행자,

+0

sun.com 링크 (내 답변 참조)에있는 다른 조언없이 -target을 사용하는 것은 위험합니다. –

+1

스위치를 사용하지 않으면 어떻게됩니까? JRE 1.4에서 오류가 발생합니까? –

+0

대부분이 클래스 비 호환성 오류 또는 비슷한 것을 제공합니다. – cjstehno

8

당신은 교차 컴파일을 할 수있는 1.5 기능을 사용할 수 없습니다.

http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html#crosscomp-example

당신은 당신이 목표로하고있는 특정 주 버전 (1.4, 그것은 같은 소리)를 지정해야합니다 :이 문서는 방법을 보여줍니다.

이 기술을 사용하면 언제나 최신 javac를 사용할 수 있습니다! 그렇게하면 모든 최신 버그 수정 및 성능 향상을 얻을 수 있으며 완벽하게 안전합니다.

편집 : 여러 답변에서 논의 된 라이브러리 비 호환성 문제를 해결합니다.

+0

나는 강력하게 동의하지 않는다. 배포 할 필요가있는 버전의 JDK와 함께 제공되는 javac을 사용하지 않으려면 대신 Eclipse 컴파일러를 사용하고 배포 할 Java 버전에서 실행하십시오. 나는 Eclipse 컴파일러가 javac보다 지난 5 년 동안 많은 관심을 보였다 고 생각한다. –

+0

나는 이클립스의 컴파일러가 훌륭하다는 것에 동의하지 않는다. –

0

예 아니요. 컴파일 할 때 "소스"및 "대상"javac 옵션을 대상 버전 (예 : 1.4)으로 설정하면 1.4 jvm에서 Java 6에서 컴파일 된 코드를 실행할 수 있습니다. 이 기능은 대상 버전 이후에 추가 된 클래스 나 언어 기능을 사용하지 않은 경우에 사용할 수 있습니다.

행운을 빈다.

0

예에 관심이있을 수 있습니다 당신이 정말로 새로운에서 오래된 자바 컴파일하려고 시도하는 경우에, 여기에 몇 가지 지침입니다 1.6 컴파일러 (javac)를 사용하여 1.4와 호환되는 클래스 파일을 생성 할 수 있지만 단순히 이렇게하면 코드가 제대로 작동하지 않을 수도 있습니다.문제는 여전히 1.6 버전의 API에 대해 컴파일된다는 것입니다.

언뜻보기에는 계약이 변경되면 안되기 때문에 문제가 될 것이라고 기대하지는 않겠지 만 IIRC를 정수로 사용하는 새로운 생성자가 BigDecimal (1.5)에 추가되었다는 점에서 문제가있었습니다. 컴파일 타임에 해당 생성자에 대한 호출이 지정되었지만 런타임에는 생성자가 존재하지 않으므로 런타임 예외가 발생했습니다. 메소드가 오버로드되고 자동 변수 변환에 의존 할 때 이와 같은 문제가 발생할 것입니다.

Javac 앱은 사실 자신이 속한 Java 버전과 독립적입니다. 1.6 javac에 사용할 다른 API를 지정할 수 있으며 모든 런타임 문제를 방지하려면이 작업을 수행해야합니다.

관련 문제