Будет ли работать компиляция для 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?
Ответы
Ответ 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" версии 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.