Подтвердить что ты не робот

Будет ли работать компиляция для Java 1.5 на Java 1.7?

Недавно я перешел на Java 7 в один из моих проектов. Я утверждаю, что он может работать на Java 1.5 просто потому, что я не могу зависеть от того, что есть в Java 6 или 7. Однако при компиляции сегодня я заметил это:

bootstrap class path not set in conjunction with -source 1.5

Google не нашел информации об этом предупреждении. Означает ли это, что вы не можете скомпилировать Java 1.5 с Java 1.7?

4b9b3361

Ответ 1

В этом блоге Oracle объясняется предупреждение:

http://blogs.oracle.com/darcy/entry/bootclasspath_older_source

Причина в том, что если вы не установили rt.jar для более старой платформы, тогда:

Если второй шаг не выполняется, javac будет покорно использовать старый языковые правила в сочетании с новыми библиотеками, что может привести к классу файлы, которые не работают на старой платформе, поскольку ссылки на несуществующие методы могут быть включены.

Ответ 2

Означает ли это, что вы не можете скомпилировать Java 1.5 с Java 1.7?

Нет, нет. Это означает, что есть правильный путь и неправильный способ сделать это... и вы делаете это неправильно.

Правильный способ компиляции для Java 1.5 на Java 1.7 JDK:

  • Получить копию "rt.jar" из Java 1.5 и поместить ее на путь компиляции bootclasspath.

  • Скомпилируйте с -source 1.5 и -target 1.5.

Предупреждающее сообщение сообщает вам, что вы не выполнили первую из них.


Способ, которым вы строите прямо сейчас, неявно использует версию "rt.jar" версии 1.7 для API-интерфейсов Java. Это может сработать! (Действительно, он должен работать, предполагая, что вы не внесли никаких изменений в код, поскольку он был построен последним на 1.5.) Однако существует риск того, что вы можете случайно ввести зависимости от классов или методов, добавленных в Java 1.6 или 1.7. Это приведет к ошибкам во время выполнения при попытке запустить ваше приложение на Java 1.5.

Ответ 3

  • Лучше настроить параметр -source и -target 1.5.

  • Чтобы быть уверенным, что вы случайно не включаете зависимости от новых классов, методов или полей, используйте плагин maven-animal-sniffer или что-то в этом роде.

Ответ 4

- источник 1.5 гарантирует, что исходные файлы соответствуют соглашениям Java 5. --target 1.5 гарантирует, что сгенерированные файлы классов соответствуют соглашениям Java 5. Ни один из них не защитит вас от использования библиотечных методов Java 6 или 7. Вы должны либо скомпилировать против соответствующего rt.jar, используя --bootclasspath, либо использовать что-то вроде плагина животного-сниффера (если вы используете maven), который будет проверять всю подпись типа и сравнивать с опубликованными профилями.

С плагином-аниматором для животных вы можете быть в курсе, потому что вы можете столкнуться с сторонними библиотеками, использующими API-интерфейсы Java 6, что может привести к сбою процесса сборки при условии, что вы преследуете Java 5.