Не удается создать приложение javafx под Java 9 таргетинг java 8

Я пытаюсь создать приложение, которое имеет графический интерфейс, построенный с JavaFX и нацеленный на java 8 с новым флагом выпуска java 9.

сборка

import javafx.application.Application;

public class Testing {
    public static void main(String... args) {

    }
}

при таргетинге java 9 с

javac Testing.java

отлично работает (также при использовании --release 9), но когда я добавляю флаг выпуска

javac --release 8 Testing.java

он не может скомпилировать предоставление не существует ошибки

Testing.java:1:error: package javafx.application does not exist

нет проблем при компиляции этого под JDK8 javac. Я пробовал использовать --add-modules флаг для добавления модулей jfx, но этот флаг не разрешен при установке выпуска на 8.

есть ли способ сделать эту работу под Java 9? Кажется, что он не думает, что пакеты jfx включены в java 8, но они (по крайней мере, в выпуске oracle).

Я использую версию java 9 для Windows и построил то же приложение без проблем в самой последней версии java 8.


I пытался добавить jfxrt.Джар из моей установки java 8 (а не rt.jar) в classpath при компиляции с --release 8 флаг, и он работает.

Я понимаю, что одной из целей флага выпуска было удалить необходимость установки нескольких версий JDK (или, по крайней мере, их rt.jar файлы). Я не уверен, было ли намерение только удалить необходимость компиляции против этого одного файла, или если намерение состояло в том, чтобы удалите необходимость компиляции для любых упакованных файлов JDK (и jfxrt.Джар входит в JDK8 [по крайней мере, в версии Oracle], не требуя специальных флагов или изменений пути к классам для его использования).

Не будучи уверенным в намерении, как-то кажется неправильным, что что-то будет компилироваться отлично под java 8, но потребует дополнительной jar для компиляции (и только компиляция не запускается) под Java 9, нацеленной на java 8 (но не при нацеливании на java 9), и, таким образом, требующей нескольких версиях JDK. Для тех, кто более знаком с предполагаемой реализацией флага выпуска, должно ли это работать таким образом?

1 ответов


поведение кажется странным, хотя с точки зрения того, как --release флаг внутренне разрешил необходимые внутренние классы jdk. Но благодаря тому, что *rt.банки удаляются в JDK9 и что javafx.application часть jfxrt.jar, это может быть вероятной причиной, почему же будет жаловаться на недостающий пакет.


компиляция раздел руководство по миграции хотя подробности этого, что --release N флаг концептуально макрос для:

-source N -target N -bootclasspath $PATH_TO_rt.jar_FOR_RELEASE_N

следовательно, он должен работать, если вы попробуете что-то подобное точно:

javac -source 8 -target 8 -bootclasspath some/path/to/jdk1.8.0_65.jdk/Contents/Home/jre/lib/rt.jar Testing.java

простым решением в замене выше, конечно, является добавление jfxrt.jar файл в путь к классам, а затем скомпилировать с помощью --release 8 флаг.


Примечание: все еще оставляет меня в недоумении, почему --release не найдет предыдущие версии rt.jar? -- Возможно, захотите проверить любые такие сообщения жуки.

комментарии:- JavaFX является считается включенным расширением в Java 8, поэтому не разрешается при таргетинге версии 8. Только те классы, которые были бы в rt.jar файл разрешен.