2010-11-12 3 views
1

У меня есть приложение Java, которое работает на встроенном устройстве. Поскольку разные устройства используют разные версии SDK устройств, я должен строить против ~ 5 различных комбинаций SDK устройства.Как условно удалить часть моего приложения во время компиляции/запуска?

Одна из этих комбинаций не поддерживает определенный метод для существующего объекта и полностью исключает другой объект из SDK.

Я использую этот метод и объект в своей программе, но только в определенной конфигурации, поэтому я хотел бы просто вернуться к другой конфигурации на устройствах, которые ее не поддерживают.

Я был бы счастлив сделать это резервное поведение во время компиляции или запуска.

Что будет самым простым способом условно удалить этот код?

Код в противном случае идентичен, поэтому я бы предпочел не создавать две отдельные ветви кода для двух SDK.

Я создаю свое приложение, используя скрипт Ant.

Мое приложение должно основываться на довольно старой версии JDK (1.1.8/1.2), если это необходимо.

ответ

2

Идея состоит в том, чтобы создать два класса с одним интерфейсом, полной реализацией и заглушкой, как с помощью метода isSupported(), так и со всеми другими методами в заглушке выбросить исключение UnsupportedOperationException. Затем я мог условно включить правильный класс во время компиляции в моем скрипте Ant.

Я решил пойти с этим, а не более динамичным подходом @Stephen C, потому что он отлично работает для наших целей, и наш доступ к устройству (включая файловую систему устройства) весьма ограничен, что затрудняет развертывание нескольких банок , установить пути к классам и т.д.

То, что я в конечном итоге делает следующим образом:

  1. Перемещение классов, которые требуют заглушек в отдельный пакет.
  2. Создайте новый каталог mypackagenamestub и скопируйте файлы, которые нужно закрепить в нем. Убедитесь, что ваша среда IDE не изменяет объявления пакетов для файлов, которые должны быть заглушены.
  3. Мы уже установили свойство пути SDK в нашем скрипте Ant, на основе которого SDK создавалось приложение, поэтому я добавил еще одно свойство omit.unsupportedmode (перефразируемое) и установил его в соответствии с истинным значением.
  4. Задайте условие, чтобы установить значение для перехода к атрибуту исключений javac, например. **/MyPackageStub/** или **/MyPackage/** на основе omit.unsupportedmode.
2

@ Автоответчик Lawrence Johnston, как это сделать во время сборки. Я думаю, что это в основном правильная идея, но вы, вероятно, не хотите, чтобы API-интерфейс плагина выдавал проверенные исключения. В идеале вы хотите, чтобы реализации старой платформы выполняли попытку «выполнить наилучшие усилия» для выполнения запрошенной функции.

Если вы хотите, чтобы принять решение во время выполнения вы можете:

  • положить различные версии класса в отдельные JAR-файлы и использовать сценарий оболочки для включения соответствующих JARs в пути к классам приложения.

  • использовать Class.forName() для динамической загрузки версии класса, соответствующего платформе.

В любом случае, вам необходимо убедиться, что классы базового приложения (которые предназначены для работы на всех платформах) не статически зависит от какой-либо из более продвинутых SDKs/JDKs.

Наконец, я был бы склонен к десупорту древних версий Java. Они были «ослепшими» много лет назад, и требование поддержать их явно удерживает вас. Например, требование обратной совместимости в вашем основном приложении означает, что он не может использовать множество новых функций, добавленных в последние выпуски Java. Сколько из ваших клиентов все еще используют эти древние выпуски Java? Почему они не могут обновить свою платформу? Действительно ли им нужна последняя версия вашего приложения?

+0

Спасибо, это полезно. И ответ на ваш последний вопрос заключается в том, что я абсолютно должен поддерживать древние версии Java, потому что это то, что производитель устройства решил надеть на устройство. Даже самые последние поддерживаемые нами устройства поддерживают более новую версию Java. –

+0

Я также мог бы уточнить, что рассматриваемый объект/метод является частью SDK производителей устройств, а не JDK. Ограничение версии JDK является лишь дополнительным ограничением. –

+0

Ummm ... факт, что все производители устройств не обновили платформу Java, на самом деле может быть благословением, хотя я, конечно, не завидую вашей работе :-) –

Смежные вопросы