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

Можно ли скомпилировать файлы классов с помощью 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-совместимые двоичные файлы (файлы классов) с Java 7 javac? Конечно, я знаю, что я не могу использовать новые функции Java 7 при этом.

Спасибо за внимание!

4b9b3361

Ответ 1

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

Конечно, я знаю, что я не могу использовать новые функции Java 7 при этом.

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


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

Ответ 2

У меня установлен jdk6. если вы проверите man-страницу javac:

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).

Ответ 3

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

Ответ 4

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

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

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

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

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