Спасибо за ваши ответы. Вот краткое изложение всех соответствующих ответов и мое собственное исследование.
Изменение байт-кода: 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
можно поместить в некоторый вспомогательный класс.