首页 > 解决方案 > 运行时组件丢失且已知更正不起作用

问题描述

我从事 JavaFX 项目已经有一段时间了,我尝试在制作 jar 的 IDE 之外启动它。

我的 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>software</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>Charachter_Creator</name>

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

  <repositories>
    <repository>
      <id>charm-glisten</id>
      <name>charm-glisten Repository</name>
      <url>https://nexus.gluonhq.com/nexus/content/repositories/releases/</url>
      <layout>default</layout>
    </repository>
  </repositories>
  

  <dependencies>
    <dependency>
      <groupId>org.aerofx</groupId>
      <artifactId>aerofx</artifactId>
      <version>0.2</version>
    </dependency>
    <dependency>
      <groupId>org.jfxcore</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>15-ea+1</version>
    </dependency>

    <dependency>
      <groupId>org.javatuples</groupId>
      <artifactId>javatuples</artifactId>
      <version>1.2</version>
  </dependency>

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>17</version>
    </dependency>

    <dependency>
      <groupId>org.controlsfx</groupId>
      <artifactId>controlsfx</artifactId>
      <version>11.0.3</version>
    </dependency>
    
    <dependency>
      <groupId>org.mariadb.jdbc</groupId>
      <artifactId>mariadb-java-client</artifactId>
      <version>2.1.2</version>
  </dependency>

    <dependency>
      <groupId>com.gluonhq</groupId>
      <artifactId>charm-glisten</artifactId>
      <version>4.4.1</version>
    </dependency>

    <dependency>
      <groupId>com.simtechdata</groupId>
      <artifactId>Switcher</artifactId>
      <version>1.3.6</version>
    </dependency>

    <dependency>
      <groupId>com.github.misc</groupId>
      <artifactId>miscellaneousWidgets</artifactId>
      <version>2.3</version>
    </dependency>
    
    <dependency>
        <groupId>pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>0.7.3</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.3</version>
        <configuration>
          <mainClass>Menu.Main</mainClass>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>8</source>
            <target>8</target>
        </configuration>
    </plugin>

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>dependency/</classpathPrefix>
                    <mainClass>Menu.Main</mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
  
    </plugins>

    <resources>
        <resource>
            <directory>src/ressources</directory>
            <includes>
                <include>fxml/*.fxml</include>
                <include>images/*.png</include>
                <include>images/*.jpg</include>
                <include>CSS/*.css</include>
                <include>pdfs/*.pdf</include>
            </includes>
        </resource>
    </resources>
  </build>

</project>

要启动我的 jar,我输入:

java -jar software-1.0-jar-with-dependencies.jar --module-path /home/lambevin/Downloads/javafx-sdk-17/lib/ --add-modules javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx-swt,javafx.web    

我试过 with =, with "", with only javafx.controlsjavafx.fxml但没有任何效果。

需要明确的是,原始消息错误一直显示:Error: JavaFX runtime components are missing, and are required to run this application

给出的路径--module-path是从单独下载的 zip 中提取的目录的路径。

添加--module-pathand--add-modules是我在互联网上找到的唯一解决方案。有人知道我的问题吗?

编辑:由 VSCode 命令给出的 Maven 的 javafx-archetype-fxml 中的最小可重现示例基本代码Java: Create Java Project...

package demo;
 
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}
<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>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>demo</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>17</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>17</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>demo</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>demo.HelloWorld</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>dependency/</classpathPrefix>
                            <mainClass>demo.HelloWorld</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                    <goal>single</goal>
                    </goals>
                </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

标签: javamavenjavafx

解决方案


有很多问题至少看起来很奇怪且容易出错,而这可能还不是全部。

javafx-fxml

<dependency>
  <groupId>org.jfxcore</groupId>
  <artifactId>javafx-fxml</artifactId>
  <version>15-ea+1</version>
</dependency>

那不应该是

<dependency>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-fxml</artifactId>
  <version>17</version>
</dependency>

它具有错误的组 ID 和不一致的版本。切勿混合版本!

您正在为 Java 8 构建,但您正在引入最低版本为 11 的东西。

请在继续之前修复您的项目设置,然后按照官方文档进行操作:https ://openjfx.io/openjfx-docs/


推荐阅读