Можно ли скомпилировать файлы классов с помощью Java 7 SDK, который может работать на Java 6 JVM?

Поскольку общедоступная Java 6 SE JRE становится все ближе к ее EOL (ноябрь 12), я собираюсь перенести свои проекты с Java 6 на Java 7. Это не будет большой проблемой, если Apple предоставит Java 7 JRE для Mac OS X. Но поскольку Apple не желает этого делать, мне все равно приходится поддерживать пользователей, которые имеют только Java 6 JRE.

Есть ли способ компилировать Java 6-совместимые двоичные файлы (файлы классов) с Java 7 javac? Конечно, я знаю, что не могу использовать новые функции Java 7 при этом.

Спасибо в ожидании!

 karmakaze24 авг. 2013 г., 21:42
 Sam Harwell31 июл. 2013 г., 00:52
 assylias11 апр. 2012 г., 16:26
 Stephen C22 июл. 2015 г., 15:31
@kamikaze - вопросы связаны, но не совпадают. В этом вопросе OP не хочет использовать функции Java 7, а в вашем вопросе он это делает. Решения разные.

Ответы на вопрос(4)

Java 7, вы можете запустить компилятор Java с помощью команды-source 1.6 а также-target 1.6 опции. Но если вы используете расширения языка Java 7, то-source 1.6 приведет к ошибкам компиляции.

Certainly I'm aware that I can't use the new Java 7 features when doing so.

Это включает в себя возможности языка Java 7 ... и зависимости от изменений Java 7 в стандартных API библиотек классов. Также имейте в виду, что существует небольшое количество поведенческих различий (так называемые исправления ошибок API), которые могут привести к тому, что код будет выполняться по-разному в Java 6 и Java 7. Они должны быть описаны в документе перехода от Java 6 к Java 7.

UPDATE - Это, вероятно, больше не проблема для вас, потому что Oracle выпустила Java 7 для Mac OSX.

 27 дек. 2012 г., 12:19
@louism - в Windows и Linux (по крайней мере) настройка JAVA_HOME напрямую не влияет на то, какая команда запускается при запускеjava, Mac OSX отличается?
 26 дек. 2012 г., 22:45
Если вы по-прежнему получаете ошибки с этим, вы можете временно переключиться обратно на Java 6. Найдите путь, запустив/usr/libexec/java_home -v '1.6*', Затем установите его как домашний путь Java, используяexport JAVA_HOME="/path/to/java6/", Убедитесь, что это работает, запустивjava -version.
 28 дек. 2012 г., 04:20
Похоже на это! См. Gist.github.com/4394202.

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

Возьмите для примера java.sql.Driver. В Java 7 интерфейс получил дополнительный метод.

Java 7 Developer Этот разработчик реализует интерфейс драйвера и использует «Override». аннотация о реализованном дополнительном методе драйвера. Программа прекрасно компилируется как программа на Java 6, потому что класс, который видит компилятор Java 6, имеет этот метод, и код регистрируется. Компиляция программы как Java 6 не означает, что компилятор Java 6 автоматически переключится на использование источника Java 6 код!

Java 6 Developer Разработчик Java 6 пытается создать код, который разработчик Java 7 совершил, и получает ошибку компиляции, даже несмотря на то, что разработчик Java 7 не реализовывал никаких языковых конструкций Java 7.

Следовательно, даже если выcould скомпилируйте его как Java 6, я бы порекомендовал не делать этого.

Cross-Compilation Options
          By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐
          ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath
          and -extdirs when cross-compiling; see Cross-Compilation Example below.

         -target version
            Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier
            versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6).

но в некоторых случаях нет. В java 1.6 у них не было попытки с ресурсами, переключения со строками или операторов multi catch и т. Д. Поэтому эти части программы не будут компилироваться. Но идея Java компилируется один раз, запускается везде; поэтому код может работать на старых JVM

Ваш ответ на вопрос