Использование функций Java 7 SDK в Java 6 - PullRequest
9 голосов
/ 29 сентября 2011

Меня интересует использование некоторых функций NIO2 в Java 7 SDK, если они доступны (в частности, наблюдатели файловой системы ), однако я не хочу компилировать свои классы для Java 7 и исключать Java6 раз.Главным образом потому, что я хочу сохранить совместимость с Mac OS X, а также потому, что я не хочу заставлять своих пользователей обновляться.

Возможно ли это?Каков наилучший способ сделать это?Любые ссылки или примеры?

Вот несколько способов, которые я могу себе представить: компилировать файл класса с помощью другого компилятора и загружать его динамически на основе версии Java?Или, может быть, с помощью отражения?Или, может быть, есть просто настройка компилятора для Java 7 для генерации Java 6-совместимых классов?

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

Ответы [ 4 ]

9 голосов
/ 30 сентября 2011

Просто соберите с помощью -target 1.6 и организуйте свой код, чтобы вы могли аккуратно перехватывать ClassNotFoundExceptions и NoClassDefFoundErrors вокруг модулей, использующих 1.7. Может быть, загрузить их с помощью отдельного загрузчика классов, например.

1 голос
/ 29 сентября 2011

Вы можете легко собрать java 1.6, как указывал инструментарий. Однако вам нужно убедиться, что вы случайно не получили доступ ни к каким методам, которых нет в java 6. Это вызовет исключение времени выполнения в вашем рабочем коде.

Если вы используете maven, вы можете использовать плагин maven-inspecer-plugin, который гарантирует, что никакие классы или вызовы java 1.7 не проникнут в ваш код, созданный для 1.6.

Примером может быть изменение с Java 1.4 на 1.5. Я строил с 1,5 с целью 1,4, и я случайно использовал:

new BigDecimal(5);

Это хорошо скомпилировано и работает нормально для меня. Но поскольку клиент все еще использовал 1.4, это не удалось. Потому что этот конструктор не существует в 1.4. Был введен в 1.5.

Другим решением было бы создать пару jar-файлов, один с новым nio-компонентом, другой со старым, и определить во время установки, запускал ли пользователь java 1.7. Если это так, добавьте jar, содержащий соответствующую реализацию.

0 голосов
/ 29 сентября 2011

С точки зрения наблюдателей за файловой системой, до Java 7 я использовал опрашивать свойства файла каждые несколько секунд или около того, чтобы убедиться, что он не изменился. Это не совсем хорошо, но практически не использует заметных ресурсов и, с точки зрения конечного пользователя, похоже, работает так же.

Если вам нужна более обширная библиотека, ознакомьтесь с http://commons.apache.org/jci/commons-jci-fam/index.html - я думаю, что это делает нечто подобное, хотя я никогда не использовал это.

Указание источника 1.7 и цели 1.6 Я почти уверен, что это не сработает, я пытался сделать это по другой причине, и из памяти JVM жаловалась на несовместимые флаги (я думаю, это из-за новой invokedynamic в 7). )

0 голосов
/ 29 сентября 2011

Для некоторых элементов, которые были добавлены в Java 7, вы можете найти jasr jar-файлы Java 6, которые предоставляют вам функциональность. Однако я не верю, что это относится к наблюдателю за файловой системой.

...