Создание приложения JavaFX в IntelliJ IDEA с использованием maven

#java #maven #intellij-idea #javafx #maven-plugin

#java #maven #intellij-idea #javafx #maven-плагин

Вопрос:

Я столкнулся с некоторыми трудностями, пытаясь создать приложение JavaFX с помощью maven. Приложение отлично работает в среде IDE. Я запускаю maven package task, и он создает JAR-файл. Проблема в том, что этот файл не запускается. Я проверил включенный манифест, и там не было точки входа. Я добавил его, но файл по-прежнему не запускается. Вот как сейчас выглядит манифест (последняя строка была добавлена вручную).:

 Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.6.3
Built-By: Комп
Build-Jdk: 15
Main-Class: org.example.App
  

Файл pom

 <?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>Refinement</artifactId>
  <version>1.0-SNAPSHOT</version>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>11.0.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-maven-plugin -->
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-maven-plugin</artifactId>
      <version>0.0.4</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.4</version>
        <configuration>
          <mainClass>org.example.App</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>


</project>
  

И журнал сборки

 "C:Program FilesJavajdk-15binjava.exe" -Dmaven.multiModuleProjectDirectory=C:UsersКомпDocumentsjavaProjectsRefinement "-Dmaven.home=C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3pluginsmavenlibmaven3" "-Dclassworlds.conf=C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3pluginsmavenlibmaven3binm2.conf" "-Dmaven.ext.class.path=C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3pluginsmavenlibmaven-event-listener.jar" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3libidea_rt.jar=65494:C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3pluginsmavenlibmaven3bootplexus-classworlds-2.6.0.jar;C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.3.3pluginsmavenlibmaven3bootplexus-classworlds.license" org.codehaus.classworlds.Launcher -Didea.version=2020.2.2 package
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< org.example:Refinement >-----------------------
[INFO] Building Refinement 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Refinement ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:UsersКомпDocumentsjavaProjectsRefinementsrcmainresources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Refinement ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ Refinement ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:UsersКомпDocumentsjavaProjectsRefinementsrctestresources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Refinement ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Refinement ---
[INFO] Surefire report directory: C:UsersКомпDocumentsjavaProjectsRefinementtargetsurefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.example.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.052 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Refinement ---
[INFO] Building jar: C:UsersКомпDocumentsjavaProjectsRefinementtargetRefinement-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  35.456 s
[INFO] Finished at: 2020-10-06T12:04:09 03:00
[INFO] ------------------------------------------------------------------------
  

Обновлено

Я попытался запустить JAR-файл из командной строки и получил сообщение об ошибке:

 Error: Could not find or load main class org.example.App
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
  

Может быть, мне нужно включить классы JavaFX в файл JAR? Я не уверен, будет ли на компьютере пользователя установлен JavaFX, и я не хочу полагаться на это.

Также я попытался перестроить файл pom, как показано в статье «Создание минимального приложения JavaFX 11 с помощью Maven«. Эта новая версия также выдает ошибку:

 Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:825)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:723)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:646)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:604)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        at org.example.Launcher.main(Launcher.java:5)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 10 more
  

Выглядит более подробно, но суть, на мой взгляд, та же.

Проверенная переменная PATH указывает на папку библиотеки JavaFX.

Комментарии:

1. Какую ошибку вы получаете при запуске приложения? Пожалуйста, попробуйте шаги из этой статьи: webtechie.be/post /…

2. Спасибо, я обновил описание

3. Позвольте мне перейти к этой проблеме, поскольку @y.bedrov был так любезен, что сослался на мой блог 😉 Кажется, вы не ссылаетесь на правильный путь JavaFX, см. askubuntu.com/questions/1136420 /… —> «java —module-path $FX-PATH —add-modules javafx.controls -jar sample.jar «где $FX-PATH должен быть установлен или заменен указанным путем JavaFX. Или, может быть, использовать LibericaJDK, который включает JavaFX: webtechie.be/post /…

Ответ №1:

Чтобы начать новый проект JavaFX, рекомендуется посетить этот (совершенно новый) веб-сайт: https://start.gluon.io /. Вы получите ZIP-файл, содержащий все файлы, и README для немедленного начала работы.

Для базового приложения отмените выбор всех «Функций Gluon», «CloudLink» и «Attach».

start.gluon.выбор ввода-вывода в веб-интерфейсе

start.gluon.предварительный просмотр ввода-вывода

start.gluon.io загрузил ZIP