Вопрос

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

  • изменение байт-кода, например.с использованием Ретропереводчик или Ретроткач.

  • резервное копирование библиотек, например. Параллельный бэкпорт, но это не помогает для дженериков.

  • эмуляция функций Java 5, например.проверенные коллекции, переменные аргументы со вспомогательными методами и т. д.

  • изменение исходного кода путем предварительной компиляции, удаление всего материала 1.5 перед окончательной компиляцией, например.с использованием Разоблачитель могу это сделать.

Меня больше всего интересует очень положительный опыт работы с ним в производственных средах с использованием Weblogic и «реальных» вещей.

Это было полезно?

Решение

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

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

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

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

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

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

Изменение исходного кода обратно на Java 1.4:Разоблачитель
Как ответил в связанный вопрос, есть Разоблачитель, расширение компилятора, которое работает для дженериков и varargs, но не для повышения для петли или автобоксировки.Сгенерированный исходный код «немного причудливый, но не так уж и плох».

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

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

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

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

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

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

Другие советы

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

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

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

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

Чтобы имитировать аннотации в Java 1.4, вы можете использовать http://xdoclet.sourceforge.net/xdoclet/index.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top