首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多模块JavaFX maven项目打包问题

多模块JavaFX maven项目打包问题
EN

Stack Overflow用户
提问于 2021-08-17 13:57:50
回答 1查看 743关注 0票数 2

这是一次用maven创建多模块JavaFX应用程序的尝试。

鉴于该项目的结构如下:

代码语言:javascript
复制
project
|  pom1.xml
|_____ Word Generator (Folder)
      |  pom2.xml
      |_____logic (folder)
            |  WordGenerator
|_____UI (folder)
      |  pom3.xml
      |_____marty  
            |  App
            |  PrimaryController
            |  SecondaryController

我们有以下的pom文件结构,按上述计划的顺序排列:

头1.

代码语言:javascript
复制
<?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.games.marty</groupId>
    <artifactId>words</artifactId>
    <packaging>pom</packaging>
    <version>0.1</version>

    <modules>
        <module>UI</module>
        <module>Word Generator</module>
    </modules>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>16</source>
                        <target>16</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

头2.

代码语言:javascript
复制
<?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">
    <parent>
        <artifactId>words</artifactId>
        <groupId>org.games.marty</groupId>
        <version>0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>word.generator</artifactId>

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

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>16</source>
                        <target>16</target>
                    </configuration>
                </plugin>
                <plugin>
                    <!-- Build an executable JAR -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.1.0</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <mainClass>org.games.marty.logic.WordGenerator</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

头3.xml

代码语言:javascript
复制
<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>
    <artifactId>UI</artifactId>
    <version>0.1</version>

    <parent>
        <artifactId>words</artifactId>
        <groupId>org.games.marty</groupId>
        <version>0.1</version>
    </parent>

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

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>16</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>16</version>
        </dependency>
        <dependency>
            <groupId>org.games.marty</groupId>
            <artifactId>word.generator</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>16</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.6</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running -->
                        <!-- Usage: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>org.games.marty.App</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>org.games.marty.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

为了使UI能够访问WordGenerator逻辑,我们尝试构建应用程序的方法是maven package,这个结果来自头1.xml指令

如前所述,我们得到了上述错误:

代码语言:javascript
复制
Error: Could not find or load main class org.games.marty.App
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

就我的理解而言,JavaFX依赖项是通过maven安装的,应该是可用的,但它们缺少吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-17 19:30:32

使用mvn package maven-jar-plugin 通过进行打包是不够的

默认情况下,mvn package只是为您的应用程序代码打包jar,它不会包含所有依赖库代码(这就是为什么在尝试运行应用程序时找不到依赖代码的原因)。

您可以使用程序集打包应用程序代码和依赖程序库,正如如何使用Maven创建具有依赖关系的可执行JAR?中详细介绍的那样,尽管这种方法并不是解决问题的唯一方法。

您需要构建某种运行时映像

构建运行时映像有很多选项,我不知道您的需求,所以我不能建议您应该做什么。示例选项如下:

  1. 应用程序的zip/tar加上单独目录中的库。
  2. 创建一个包含所有依赖代码的jar。
  3. 解决方案1或2之一,加上打包的JRE。
  4. 一个包含您的代码和库的运行时映像,它也只使用您需要的JRE和JavaFX模块的自定义运行时部分(使用jlink)。
  5. 用于3或4的本机安装程序(使用jpackage +本地安装程序创建工具,例如WIX、RPM、DEB安装程序创建者)。

最后一个方法(本机安装程序)是我推荐给大多数非平凡应用程序的打包、分发和安装方法。

你需要研究如何做这个

为了获得解决方案,您需要自己进行研究,一旦您选择了一个方法和工具集,如果您继续遇到困难,您可以创建一个关于该方法的实现的新问题。

相关资源

对阴影罐的警告

如果使用maven阴影插件将所有JavaFX代码打包到一个jar中,则在从16+运行应用程序时会收到如下警告:

WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @28c71909'

这表明这种配置不受支持,而且可能(而且可能会)在将来甚至是当前的JavaFX平台修订版中崩溃。因此,我不推荐包含JavaFX平台代码的阴影jars,尽管这些jars目前可能适用于您的部署。

JavaFX 11+是作为一组模块构建的。如果配置不从模块路径运行JavaFX平台,而是在类路径上运行平台代码(就像阴影jar那样),则不支持配置。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68818710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档