Сохраните один «главный» исходный корень, который собирается под JDK 5. Добавьте второй параллельный исходный корень, который должен быть собран под JDK 6 или выше. (Не должно быть перекрытия, т. Е. В обоих классах не должно быть классов.) Используйте интерфейс, чтобы определить точку входа между ними, и немного отражения.
Например:
---%<--- 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);
}
}
---%<---
Вы можете настроить их как отдельные проекты в IDE, используя разные JDK и т. Д. Дело в том, что основной корень может быть скомпилирован независимо, и очень ясно, что вы можете использовать в каком корне, тогда как если вы пытаетесь компилировать разные части одного корня по отдельности слишком легко случайно «просочить» использование JDK 6 в неправильные файлы.
Вместо того, чтобы использовать Class.forName, как это, вы также можете использовать какую-то систему регистрации служб - java.util.ServiceLoader (если main может использовать JDK 6 и вам нужна дополнительная поддержка JDK 7!), NetBeans Lookup, Spring и т. д. и т. д.
Тот же метод можно использовать для создания поддержки дополнительной библиотеки, а не более новой JDK.