2012-04-11 3 views
23

공개 Java 6 SE JRE가 EOL (12 월 '12)에 가까워지고 있기 때문에 프로젝트를 Java 6에서 Java 7로 포팅하는 것을 고려하고 있습니다. Apple이 Java를 제공한다면 큰 문제는 아닙니다. 7 JRE for Mac OS X. 그러나 Apple은 기꺼이 그렇게하지 않기 때문에 Java 6 JRE 만있는 사용자를 지원해야합니다.Java 6 JVM에서 실행할 수있는 Java 7 SDK를 사용하여 클래스 파일을 컴파일 할 수 있습니까?

Java 7 호환 바이너리 (클래스 파일)를 Java 7 javac와 함께 컴파일하는 방법이 있습니까? 필자는 그렇게 할 때 새로운 Java 7 기능을 사용할 수 없다는 것을 알고 있습니다.

고맙습니다.

+1

관련 항목 : http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -run-t – assylias

+0

[ant bootclasspath 설정 가능 : JDK 1.7에는 bootclasspath없이 이전 소스를 설정하기위한 새로운 javac 경고가 있습니다.] (http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-warning-for-the-old-sour) –

+0

중복 된 http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze

답변

21

에 달려 있습니다. 프로그램이 새로운 Java 7 언어 확장을 사용하지 않으면 및 -target 1.6 옵션을 사용하여 Java 컴파일러를 실행할 수 있습니다. 그러나 Java 7 언어 확장을 사용하는 경우 -source 1.6은 컴파일 오류를 발생시킵니다.

필자는 그렇게 할 때 새로운 Java 7 기능을 사용할 수 없다는 것을 알고 있습니다.

여기에는 Java 7 언어 기능과 Java 7 표준 클래스 라이브러리 API의 변경 사항이 포함되어 있습니다. 또한 Java 6 및 Java 7에서 코드가 다르게 작동하는 동작 차이 (일명 API 버그 수정)가 있음을 유의하십시오. Java 6 및 Java 7 전환 문서에서 설명해야합니다.


UPDATE - 어쨌든 당신이 아마 더 이상 문제는, 오라클 때문에 맥 OSX를위한 자바 7 발표했다.

+0

여전히 오류가 발생하면 일시적으로 Java 6으로 전환 할 수 있습니다.'/ usr/libexec/java_home -v '1.6 *''을 실행하여 경로를 찾으십시오. 그런 다음'export JAVA_HOME = "/ path/to/java6 /"'를 사용하여 Java 홈 경로로 설정하십시오. 'java -version'을 실행하여 작동하는지 확인하십시오. – user2398029

+0

@louism - Windows 및 Linux (최소) 설정에서 JAVA_HOME은'java'를 실행할 때 어떤 명령이 실행되는지 직접 영향을주지 않습니다. Mac OSX는 다른가요? –

+0

그것은 그것 같이 보인다! gist.github.com/4394202를 참조하십시오. – user2398029

5

jdk6이 설치되어 있습니다. javac의 메뉴얼 페이지를 확인하는 경우 :

Cross-Compilation Options 
      By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐ 
      ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath 
      and -extdirs when cross-compiling; see Cross-Compilation Example below. 

     -target version 
      Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier 
      versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6). 
3

예 (일부 경우는 아니오). 자바 1.6에서 그들은 자원을 가지고 시도하거나, 문자열로 전환하거나, 다중 문을 잡아 내지 못했습니다. 그래서 프로그램의 해당 부분은 컴파일되지 않습니다. 그러나 자바의 아이디어는 한 번 컴파일되어 어디에서나 실행됩니다. 코드가 이전 JVM에서 작동 할 수 있습니다.

3

Stephen C의 대답은 정확하지만 완전하지는 않습니다. Java 7 언어 기능을 사용하는 경우 Java 7 프로그램은 Java 6에서 컴파일되지 않지만 Java 6 및 다른 Java 7 코딩에서 개발자가 미묘하게 다른 버그가 발생할 수 있다는 경고를 받아야합니다.

예를 들어 Java. sql.Driver. 자바 7에서 인터페이스는 추가적인 방법을 얻었다.

Java 7 Developer 이 개발자는 Driver 인터페이스를 구현하고 구현 된 추가 Driver 메소드에 'Override'주석을 사용합니다. Java 6 컴파일러가 보는 클래스는 해당 메소드를 가지고 코드가 체크인되기 때문에 프로그램은 Java 6 프로그램으로 정상적으로 컴파일됩니다. 프로그램을 Java 6으로 컴파일한다고해서 Java 6 컴파일러가 자동으로 Java 6 소스를 사용하도록 전환하지는 않습니다 암호!

자바 6 개발자 는 자바 6 개발자는 자바 7 개발자가 저지른 코드를 구축을 시도하고 자바 7 개발자가 자바 7 언어 구조를 구현하지 않은 경우에도 컴파일 오류를 가져옵니다.

따라서 이 Java 6으로 컴파일 될 수 있지만이 작업을 수행하지 않는 것이 좋습니다.

관련 문제