JavaFX Maven 插件:com.zenjava - 如何复制外部资源

JavaFX Maven Plugin: com.zenjava - How to copy external resources

我对 Maven + JavaFX 比较陌生,我正在尝试使用 com.zenjava maven 插件生成 JavaFX 可执行 jar 文件。

我正在遵循此指南以供参考:
https://www.youtube.com/watch?v=wbjW8rYlook

我的项目有以下文件夹结构:

现在我正在尝试 运行 在 Maven 构建期间配置 jfx:jar 并且能够生成一个 jar 文件但是我需要的资源没有复制到 target/jfx/app 文件夹下.

基本上,我想将整个 src/main/resources 文件夹复制到 target/jfx/app/resources。我该如何实现?

一些信息:
src/main/resources/ 文件夹将包含我在 运行 期间需要的各种文件(excel 文件、pdf、htmls...),而不仅仅是 属性 文件。

提前致谢。

============================================= ===========================
更新:
Yuri-M-Dias 的回答很有帮助。

在不更改任何其他设置的情况下,我设法通过更新我的 pom 文件来做到这一点:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>../jfx/app/resources</targetPath>
        </resource>
    </resources>



    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>com.zenjava</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>8.7.0</version>
            <configuration>
                <mainClass>me.iamkenos.bayonetta.MainApp</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

这绝对有效,但我不确定这是否是最好的方法,因为我不得不通过在 <targetPath>../jfx/app/resources</targetPath> 中使用“../”来作弊,将等待其他可能的方法暂时回答。

您可以使用 resources 关键字将 Maven 的输出文件夹控制到特定文件夹。例如,在我的项目中:

    <resources>
        <resource>
            <directory>src/main/java/view</directory>
            <targetPath>view</targetPath>
        </resource>
    </resources>

在这种情况下,我强制将 java/view 文件夹的内容输出到 target/classes/view,因为这是我的 JavaFX 图像和 fxml 所在的位置。您可以对 jfx/app/resources 文件夹执行相同的操作。

关于复制文件夹,你可以看看official maven recommendation

当您 运行 命令 jfx:jar 时,您将获得可执行文件 jar file with resources folder inside 因为您已将资源文件夹添加到构建路径。

如果您只是将整个 src/main/resources 文件夹复制到 target/jfx/app/resources 文件夹,您将拥有相同资源文件的副本(生成的 jar 文件的内部和外部),如果您需要允许用户编辑一些资源文件(例如 *.properties 文件)我猜你的代码将依赖于内部文件,因此用户更改在这种情况下没有任何影响。

这就是为什么您需要将项目资源拆分为:

  • 内部(生成的 jar 文件的一部分,例如光栅图形和 read-only 配置)
  • 外部(位于 jar 文件之外,例如用户可以编辑的配置文件)

我建议创建 3 个文件夹

  • \src\main\java(源代码)- 构建路径的一部分
  • \src\main\resources(内部)-构建路径的一部分
  • \src\main\config(外部)- 从构建路径中排除

使用 maven 复制外部配置文件夹并构建可执行的 jfx jar

<build>
    <resources>
        <resource>
            <directory>src/main/config</directory>
            <targetPath>../jfx/app/config</targetPath>
        </resource>
    </resources>
</build>

<plugins>
    <plugin>
        <groupId>com.zenjava</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>8.8.3</version>
        <configuration>
            <vendor>${vendor}</vendor>
            <mainClass>${mainClass}</mainClass>
            <allPermissions>true</allPermissions>
        </configuration>
    </plugin>
</plugins>

最后一步是配置 symlink path to allow eclipse work in debug mode properly with external resources. You can use Link Shell Extension 来完成它。

对于 Windows 它可能看起来像

mklink /J C:\...\target\classes C:\...\target\jfx\app\config
LinkToFolder                    OriginalFolder

LinkToFolder 是编译后的 eclipse 项目文件夹 类