web-dev-qa-db-fra.com

Projet Maven avec JavaFX (avec fichier jar dans `lib`)

Je mets en place un projet maven, qui va utiliser JavaFX. Depuis que j'ai entendu dire que JavaFX n'est pas fourni avec toutes les versions de Java, j'ai téléchargé et mis le jfxrt.jar fichier dans un répertoire lib dans mon projet.

1) Comment spécifier que la dépendance (c'est-à-dire JavaFX) ne doit pas être téléchargée, mais qui se trouve dans lib?

2) Cela signifie-t-il alors que le projet peut être construit sur n'importe quelle machine avec JDK (et pas nécessaire JDK 1.7 - mise à jour 9+)?

42
One Two Three

Mise à jour 2019 pour les versions récentes de JavaFX

À partir de Java 11, JavaFX a été découplé du JDK, de sorte que les bibliothèques JavaFX ne sont plus automatiquement regroupées avec une installation JDK (comme elles l'étaient par exemple dans la distribution Oracle JDK 8). Au lieu de cela, le système JavaFX est désormais conçu comme un ensemble de bibliothèques distinctes indépendantes du JDK, qui peuvent être téléchargées à partir d'un référentiel par un outil tel que Maven pour une utilisation par votre application.

openjfx.io a un très court tutoriel sur l'utilisation de JavaFX 11+ avec Maven:

Ce didacticiel recommande l'utilisation du Plugin OpenJFX JavaFX Maven et fournit l'exemple de fichier de projet maven pom.xml suivant pour une application de style "hello, world".

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

Notez que le org.openjfx plugin maven JavaFX utilisé pour Java 11+ est différent du com.zenjava plugin maven JavaFX utilisé pour Java 8 et 9, utilisez donc la version appropriée pour votre Java version.

Approche suggérée

Pour créer des applications JavaFX avec Maven:

  1. Utilisez le com.zenjava maven plugin JavaFX avec Java 8 et 9 ET/OU
  2. Utilisez Java 8 ou 9 et ne spécifiez aucun type de dépendance Maven pour JavaFX OU
  3. Utilisez le org.openjfx plugin JavaFX maven avec Java 11+.

Contrairement à Java 7, avec Java 8, il n'est pas nécessaire de définir JavaFX en tant que dépendance maven, car JavaFX se trouve sur le chemin d'accès aux classes d'exécution standard Java Swing c'est aujourd'hui).

Opinion

Je pense que l'approche dans votre question de placer le fichier jfxrt.jar Dans un répertoire de projet lib est défectueuse.

Les raisons pour lesquelles il est défectueux sont:

  1. JavaFX inclut également des bibliothèques natives, vous devez donc également les inclure (dans un emplacement où jfxrt.jar Pourrait les trouver).
  2. Une version donnée de JavaFX ne sera certifiée que pour fonctionner avec la version du JDK avec lequel elle est livrée, donc le runtime JavaFX que vous placez dans le répertoire lib de votre projet peut ne pas fonctionner avec une version JDK ultérieure, telle que JDK 8.
  3. Les futures versions du JDK telles que JDK 8 incluront JavaFX sur le chemin de classe par défaut du JDK, donc vous pourriez avoir des conflits avec la version que vous placez dans votre répertoire lib.

En résumé, JavaFX doit être traité comme faisant partie du système d'exécution Java et non comme une bibliothèque de projet.

Exemple de dépendance système JavaFX

Si vous devez utiliser Java 7 et que vous ne souhaitez pas utiliser le plug-in JavaFX maven, vous pouvez adopter l'approche la moins recommandée:

  • Référencez la bibliothèque JavaFX à partir du jdk (pas votre répertoire de projet lib) comme une dépendance système maven .

Cet exemple est fourni pour Java 7 uniquement et n'est pas requis (et ne fonctionnera pas tel quel) pour Java 8. Java 8, place le jfxrt.jar dans $ {Java.home} /lib/ext/jfxrt.jar, qui se trouve sur le chemin de classe d'exécution Java par défaut, rendant une dépendance système pour Java 8 non pertinente.

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

Si vous empaquetez votre application en utilisant une dépendance système comme celle-ci, vous devrez alors écrire des instructions d'exécution pour vos utilisateurs afin qu'ils puissent ajouter jfxrt.jar au chemin de classe d'exécution lors de l'exécution de votre application sur Java 7 C'est une très bonne raison de ne pas utiliser cette approche.

Si vous choisissez d'utiliser l'approche de dépendance du système maven, vous pouvez également utiliser le maven plugin antrun pour incorporer les appels aux tâches ant JavaFX comme dans = cet exemple . Vous pouvez également utiliser le plug-in mavenforcer pour vous assurer que votre application est construite avec au moins la version minimale requise de Java contenant une version JavaFX requise par votre application pour travail.

65
jewelsea