JDK 5에서 빌드하는 "마스터"원본 루트 하나를 유지하십시오 JDK 6 또는 그 상위 버전에서 빌드해야하는 두 번째 병렬 소스 루트를 추가하십시오. 중복이 없어야합니다. 즉 두 클래스 모두에 클래스가 없습니다. 인터페이스를 사용하여 둘 사이의 진입 점을 정의하고 약간의 리플렉션을 정의하십시오. 당신은 등 IDE를 별도의 프로젝트를 다른의 JDK를 사용하여 이러한를 구성 할 수
---%<--- main/RandomClass.java
// ...
if (...is JDK 6+...) {
try {
JDK6Interface i = (JDK6Interface)
Class.forName("JDK6Impl").newInstance();
i.browseDesktop(...);
} catch (Exception x) {
// fall back...
}
}
---%<--- main/JDK6Interface.java
public interface JDK6Interface {
void browseDesktop(URI uri);
}
---%<--- jdk6/JDK6Impl.java
public class JDK6Impl implements JDK6Interface {
public void browseDesktop(URI uri) {
java.awt.Desktop.getDesktop().browse(uri);
}
}
---%<---
: 예를 들어
주요 루트는 독립적으로 컴파일 될 수 있으며 어떤 루트에서 사용할 수 있는지는 분명하지만 단일 루트의 다른 부분을 개별적으로 컴파일하려고하면 JDK 6의 사용을 실수로 "누출"하기 쉽습니다 잘못된 파일에 저장하십시오.
Class.forName을 이와 같이 사용하는 대신 java.util.ServiceLoader (주 JDK 6을 사용할 수 있고 JDK 7에 대한 선택적 지원이 필요하면!), NetBeans Lookup, Spring 등.
더 새로운 JDK가 아닌 선택적인 라이브러리에 대한 지원을 생성하는 데 동일한 기술을 사용할 수 있습니다.
Java 컴파일러의 문서화 된 동작입니까? –
이 답변은 틀린 것 같습니다. 필자는 java.io.Console과 위의 접근법을 사용한 빠른 Java 응용 프로그램을 만들었습니다. 컴파일러가 1.5에서 다음과 같은 오류로 실패했습니다. Test.java:8 : 심볼을 찾을 수 없습니다. console() 위치 : 클래스 java.lang.System – noahlz
1.6에서 컴파일하고 특정 1.5 JVM에서 실행될 때 런타임 기능. 물론, "유효하지 않은 부 버전 49.0"오류를 피하기 위해 1.5 JVM 바이트 코드 형식으로 다시 컴파일해야합니다. 이러한 접근 방식의 경우이 솔루션이 효과가 있습니다. – noahlz