Backport Java 5/6 функции для Java 1.4? - PullRequest
8 голосов
/ 18 июня 2009

Мы застряли с Java2SE v1.4 до конца 2010 года. Это действительно противно, но мы ничего не можем поделать.Какие варианты у нас есть, чтобы использовать некоторые из новых функций уже сейчас?Я могу придумать несколько способов, таких как

  • изменение байт-кода, например, с помощью Retrotranslator или Retroweaver .

  • бэкпорт библиотек, например Concurrent Backport , но это не помогает для обобщений.

  • эмуляция функций Java 5, например, проверенных коллекций, Varargs with helperметоды и т. д.

  • изменение исходного кода с помощью предварительной компиляции, удаление всех 1,5 элементов перед финальной компиляцией, например, использование Declawer может сделать это.

Меня больше всего интересует положительный опыт использования в производственных средах, использующих Weblogic и "реальные" вещи.

Ответы [ 5 ]

11 голосов
/ 08 июля 2009

Спасибо за ваши ответы. Вот краткое изложение всех соответствующих ответов и мое собственное исследование.

Изменение байт-кода: Retros
Это делается с помощью «ретро» -инструментов : Ретротранслятор , Ретро-ткач и JBossRetro . Ретротранслятор кажется самым зрелым и активный из них инструмент. Эти инструменты сканируют все классы и изменяют байт-код для удаления функций Java 5 и 6. Многие функции Java5 поддерживаются, некоторые используя сторонние библиотеки бэкпорта. Этот вариант наиболее популярен и имеет положительные отзывы пользователей. Эксперименты показали, что он работает как ожидается. Смотрите краткий обзор developerworks .

Pro: вы можете разрабатывать полностью на Java 5, создавать модули и все виды JAR-файлов. В конце вы просто преобразуете все классы в Java 1.4 и упаковываете свой EAR. Это легко сделать с помощью интеграции Ретротранслятора с Maven (org.codehaus.mojo:retrotranslator-maven-plugin).

Con: Консервативные среды не позволяют развертывать измененный байт-код. Результат ретро-шага не виден ни одному кодировщику и не может быть одобрен. Вторая проблема - это страх: может быть какая-то загадочная проблема производства, и ретро-код - это еще один шаг, который можно обвинить в этом. Поставщики App-серверов может отказаться от помощи из-за изменения байт-кода. Так что никто не хочет брать на себя ответственность использовать его в производстве. Поскольку это скорее полицейский, чем технический проблема, поэтому я не вижу решения. Это случилось с нами, поэтому я искал дополнительные варианты: - (

Компиляция Java5 в Java 1.4: jsr14
Существует неподдерживаемая опция javac -source 1.5 and -target jsr14, которая компилирует исходный код Java5 в допустимый байт-код Java 1.4. Большинство функций, таких как В любом случае varargs или расширенный цикл переводятся компилятором. Обобщения и аннотации удалены. Перечисления не поддерживаются и я не знаю об автобоксе, так как методы valueOf были в основном введены в Java5.

Con: переводится только байт-код, использование библиотеки не изменяется. Поэтому вы должны быть осторожны, чтобы не использовать специфичные для Java5 API (но могли бы использовать Backports). Кроме того, вы должны создавать все модули одновременно, потому что для разработки вам, вероятно, нужен код Java5 с общей информацией и информацией аннотаций. Таким образом, вы должны собрать весь проект с нуля для производства Java 1.4.

Смена исходного кода на Java 1.4: Declawer
Как ответили в связанном вопросе , существует Declawer , расширение компилятора, которое работает для обобщений и переменных, но не для улучшенных циклов Autoboxing. Сгенерированный источник "немного прикольный, но не слишком плохой".

Pro: созданный источник доступен и может быть просмотрен. В худшем случае исправления могут быть сделаны в этом источнике. Там нет "магии", потому что источник действительна Java. Некоторые люди даже используют JAD (декомпилятор Java), чтобы снова получить исходный код Java 1.4. Выходные данные Jad для чтения доступны для чтения, если вы компилируете с отладкой информация и не используйте внутренние классы.

Con: Подобно -target jsr14, вам потребуется дополнительный шаг в развертывании. Те же проблемы с библиотеками.

Смена источника обратно на Java 1.4: вручную
Несколько ответов предлагали сделать это вручную. Для автоматического повторяющегося процесса сборки это, конечно, бесполезно, но для одноразовых изменений это разумный. Просто автоматизируйте то, что возможно. Возможно, посмотрите на Antlr для создания собственного инструмента конвертации.

Backported Библиотеки:
Проблема в том, что Java5 также поставляет новые библиотеки, которые недоступны в более старых JRE, см. связанный вопрос . К счастью, есть несколько библиотеки с обратным портированием, которые предоставляют вам некоторые функциональные возможности Java5, но не могут имитировать языковые функции, такие как дженерики.

Эмуляция функций Java5 в коде Java 1.4:
Я думал о некоторых вещах, которые вы могли бы сделать, чтобы упростить свою жизнь, и при этом оставаться с Java 1.4. Наиболее важными особенностями являются безопасные коллекции, вот несколько идей:

  • Вместо использования шаблонов вы можете создавать собственные безопасные контейнеры с некоторым шаблоном.
  • Добавить типизированный итератор (который больше не является итератором).
  • Добавить asList методы, которые позволяют 1,2,...,n аргументы и их массив (для имитации переменных).
  • Методы для varargs (преобразования 1,...,n аргументов в массивы) и valueOf можно поместить в некоторый вспомогательный класс.
2 голосов
/ 18 июня 2009

Вы можете кодировать с функциями JDK 1.5 и целевым JDK 1.4 во время компиляции. Смотрите доступные варианты Javac. Однако большинство библиотек сейчас используют код JDK 1.5, поэтому вы застрянете со старыми библиотеками.

2 голосов
/ 18 июня 2009

прекомпиляция исходного кода, зачистка все 1,5 материала до окончательной компиляции и развертывание. Есть ли инструменты который может это сделать?

Да. Их называют Retrotranslator или Retroweaver. Помимо Generics (которые существуют только для компилятора в любом случае), вы не можете просто «убрать 1,5 вещи». Перечисления (и, возможно, также некоторые другие функции) должны быть заменены функционально эквивалентным кодом. Именно это и делают эти инструменты.

0 голосов
/ 08 июля 2009

Для имитации аннотаций в Java 1.4 вы можете использовать http://xdoclet.sourceforge.net/xdoclet/index.html

0 голосов
/ 18 июня 2009

Стоит отметить, что пока Java 1.4 была EOL в течение некоторого времени. Java 5.0 будет EOL 8 октября 2009 года. Если кто-то обещает вам Java 5.0 к 2010 году, я бы спросил почему?!

...