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

Проект Maven с JavaFX (с файлом jar в `lib`)

Я создаю проект maven, который будет использовать JavaFX. Поскольку я слышал, что JavaFX не поставляется со всеми версиями Java, я загрузил и поместил файл jfxrt.jar в каталог lib в моем проекте.

1) Как я могу указать, что зависимость (то есть, JavaFX) не должна быть загружена, но находится в lib?

2) Означает ли это, что проект может быть построен на любой машине с JDK (и не обязательно JDK 1.7 - обновление 9+)?

4b9b3361

Ответ 1

Обновление 2019 для последних версий JavaFX

Начиная с Java 11, JavaFX был отделен от JDK, поэтому библиотеки JavaFX больше не связываются автоматически вместе с установкой JDK (как это было, например, в дистрибутиве Oracle JDK 8). Вместо этого система JavaFX теперь разработана в виде набора отдельных библиотек, независимых от JDK, которые можно загрузить из репозитория с помощью такого инструмента, как Maven, для использования в вашем приложении.

У openjfx.io очень краткое руководство по использованию JavaFX 11+ с Maven:

В этом руководстве рекомендуется использовать плагин OpenJFX JavaFX Maven и предоставляется следующий пример файла проекта maven pom.xml для приложения в стиле "привет, мир".

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.openjfx</groupId>
  <artifactId>hellofx</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>12.0.1</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.2</version>
        <configuration>
          <mainClass>HelloFX</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Обратите внимание, что подключаемый модуль JavaFX maven org.openjfx, используемый для Java 11+, отличается от подключаемого модуля JavaFX maven com.zenjava, используемого для Java 8 и 9, поэтому используйте соответствующий для вашей версии Java.

Предлагаемый подход

Для создания приложений JavaFX с Maven:

  1. Используйте плагин com.zenjava maven JavaFX с Java 8 и 9 И/ИЛИ
  2. Используйте Java 8 или 9 и не указывайте никакой зависимости Maven для JavaFX ИЛИ
  3. Используйте подключаемый модуль JavaFX org.openjfx maven с Java 11+.

В отличие от Java 7, в Java 8 нет необходимости устанавливать JavaFX как зависимость maven, потому что JavaFX находится на стандартном пути к классам выполнения Java (аналогично тому, как Swing сегодня).

мнение

Я думаю, что подход в вашем вопросе о размещении файла jfxrt.jar в каталоге lib проекта некорректен.

Причинами этого являются:

  1. JavaFX также включает в себя нативные библиотеки, поэтому вам нужно будет также включить их (в месте, где jfxrt.jar сможет их найти).
  2. Данная версия JavaFX будет сертифицирована только для работы с той версией JDK, с которой она поставляется, поэтому среда выполнения JavaFX, помещенная в каталог lib вашего проекта, может не работать с более поздней версией JDK, такой как JDK 8.
  3. В будущих версиях JDK, таких как JDK 8, JavaFX будет включен в путь к классам JDK по умолчанию, поэтому вы можете столкнуться с версией, которую вы lib каталог lib.

Таким образом, JavaFX должен рассматриваться как часть системы времени выполнения Java, а не как библиотека проекта.

Пример зависимости системы JavaFX

Если вы должны использовать Java 7 и не хотите использовать плагин JavaFX maven, то вы можете воспользоваться менее рекомендуемым подходом:

Этот пример предоставляется только для Java 7 и не требуется (и не будет работать как есть) для Java 8. Java 8 помещает файл jfxrt.jar в $ {java.home}/lib/ext/jfxrt.jar, который на пути к классам среды выполнения Java по умолчанию, что делает системную зависимость для Java 8 неактуальной.

<dependency>
  <groupId>javafx</groupId>
  <artifactId>jfxrt</artifactId>
  <version>${java.version}</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/jfxrt.jar</systemPath>
</dependency>

Если вы упаковываете свое приложение, используя системную зависимость, подобную этой, то вам нужно будет написать некоторые инструкции по выполнению для ваших пользователей, чтобы они могли добавить jfxrt.jar в путь к классам времени выполнения при запуске вашего приложения на Java 7. Это очень хорошо Причина не использовать этот подход.

Если вы решите использовать подход системной зависимости maven, вы также можете использовать плагин maven antrun для встраивания вызовов в задачи Ant для JavaFX, как в этом примере. Возможно, вы также захотите использовать плагин mavenforcer, чтобы убедиться, что ваше приложение построено по крайней мере на минимально необходимой версии Java, содержащей версию JavaFX, необходимую вашему приложению для работы.