2013-06-22 5 views
1

У меня есть библиотека, которую я сейчас разрабатываю с целевой совместимостью с JDK 6. Мне нравится использовать функцию Java 8, например lambdas. Код и API значительно выиграют от Java 8.Лучшая практика для разработки под несколькими JDK

Я хотел бы предложить версии библиотеки для Java 6 и Java 8, например, где определенная часть доступна только в версии Java 8.

Теперь есть несколько основных классов, которые могут иметь свою исходную версию (устаревшая версия Java 6 и новая версия Java 8).

Какова наилучшая практика? В Objective-C или C++ я бы рассмотрел использование директивы препроцессора.

+1

Вы можете указать конкретный код JDK в библиотеку и включить правильный во время компиляции. Затем вы должны использовать непрерывную среду интеграции (например, Jenkins) для компиляции различных версий с разных JDK. (И запустите все ваши тесты, очевидно). –

ответ

0

Я думаю, вы можете использовать свойства системы (http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html), чтобы узнать, какая версия Java используется, а затем вы можете адаптировать приложение для запуска соответственно.

+1

проблема заключается в том, что скомпилированные классы будут содержать заголовок версии. Если эта версия слишком высока, JDK будет освобождаться при загрузке класса. Вы должны были бы сделать все с размышлениями, чтобы избежать этого - правая боль. –

2

Я вижу несколько вариантов:

  1. Пакет различные версии библиотеки, один для JDK6 и один для JDK8. Пользователи несут ответственность за включение правильного для своего приложения. Это будет интересная сборка. Если вы используете Maven, я думаю, вы просто будете использовать 3 проекта; проект «commons» со всеми общими классами, проект «JDK6», который имеет проект commons как зависимость и строит банку JDK6, а затем проект «JDK8», который имеет проект commons как зависимость и создает банку JDK8. Один из привлекательных аспектов этого подхода заключается в том, что он, очевидно, работает, и вам нелегко выполнить его.
  2. Пакет как JDK6, так и JDK8 в том же JAR и создайте класс типа «Runtime», который отвечает за создание правильных версий объектов вашей библиотеки во время выполнения в зависимости от запущенного JDK. Например:

    public abstract class Runtime { 
        private static Runtime instance; 
    
        public static Runtime getInstance() { 
         if(instance == null) { 
          try { 
           if(System.getProperty("java.version").startsWith("8")) 
            instance = Class.forName("com.yourcompany.libname.runtime.Runtime8").newInstance(); 
           else 
            instance = Class.forName("com.yourcompany.libname.runtime.Runtime6").newInstance(); 
          } 
          catch(Exception e) { 
           throw new RuntimeException("Could not create runtime", e); 
          } 
         } 
         return instance; 
        } 
    
        public abstract Framework getFramework(); 
    } 
    

    Используя этот подход, вам нужно будет только использовать отражение, чтобы загрузить исходный «Runtime» объект, а затем вы можете использовать родной Java для всего остального. Например:

    Framework framework=Runtime.getInstance().getFramework(); 
    ModelObject1 m=framework.newModelObject1(); 
    // ... 
    

    Просто убедитесь, что ваш Runtime6 класс не относится к классу JDK8, даже транзитивно с помощью импорта. Основным недостатком этого подхода является отслеживание этого небольшого количества времени.

Я думаю, что вы делаете это интересно, и мне очень любопытно узнать, как вы решили это сделать. Пожалуйста, держите нас в курсе!

+0

Это хороший ответ, но в моем вопросе акцент делается на «Развитии». Хорошо, что у вас два разных JAR - один для JDK 6, один для JDK 8. Меня больше интересовала настройка IDE. Может быть, вопрос может быть недостаточно точным –