如何通过javafx-maven-plugin将Java可执行文件放入指定目录?
当然可以实现!咱们可以通过调整javafx-maven-plugin的配置,再配合一点Maven的资源复制操作,就能把Java可执行文件放到Java.runtime/Contents/Home/bin目录里。下面分两种场景给你具体方案:
场景1:让JLink直接在Runtime的bin目录生成你的应用可执行文件
如果你的应用是模块化的,你可以借助JLink的launcher参数,让它在生成的Runtime的bin目录下直接创建一个启动你应用的可执行文件。这是最直接的方式,不需要额外复制文件。
调整你的javafx-maven-plugin配置如下:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <!-- 指定你的主类全路径 --> <mainClass>com.yourpackage.YourMainClass</mainClass> <!-- JLink配置:生成自定义启动器到Runtime的bin目录 --> <jlink> <!-- 格式:[启动器名称]=[模块名]/[主类全路径] --> <launcher>myapp=com.yourmodule/com.yourpackage.YourMainClass</launcher> <addModules> <addModule>jdk.jshell</addModule> <addModule>com.yourmodule</addModule> </addModules> </jlink> <!-- 保留你原有的Bundle配置 --> <bundleArguments> <icon.icns>src/main/resources/icns/icon.icns</icon.icns> </bundleArguments> </configuration> <executions> <execution> <id>default-cli</id> <phase>package</phase> <goals> <goal>jlink</goal> <goal>jpackage</goal> </goals> </execution> </executions> </plugin>
当你执行mvn package的时候,JLink会生成包含jdk.jshell和你应用模块的Runtime,并且在Java.runtime/Contents/Home/bin目录下生成名为myapp的可执行文件——直接运行它就能启动你的应用。
场景2:复制外部已有的Java可执行文件到目标目录
如果你的可执行文件是外部生成的,不是JLink直接生成的,那可以用maven-resources-plugin在打包阶段把它复制到JLink生成的Runtime目录里,之后JPackage会自动把这个目录打包到Java.runtime/Contents/Home/bin中。
先添加maven-resources-plugin的配置:
<plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-executable-to-runtime</id> <!-- 在JLink生成镜像之后、JPackage打包之前执行复制 --> <phase>prepare-package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <!-- JLink生成的镜像目录,默认是这个路径 --> <outputDirectory>${project.build.directory}/jlink/image/bin</outputDirectory> <resources> <resource> <!-- 你的可执行文件所在的目录 --> <directory>src/main/resources/executables</directory> <!-- 要复制的可执行文件名 --> <includes> <include>your-custom-executable</include> </includes> <filtering>false</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin>
然后保留你原有的javafx-maven-plugin配置(包括bundleArguments里的add-modules和图标设置)就行。执行mvn package时,这个插件会自动把指定的可执行文件复制到Runtime的bin目录,最终打包进你的app bundle里。
小提醒
按照macOS的App Bundle规范,应用的主启动器通常放在Contents/MacOS目录下,但技术上我们完全可以把可执行文件放到Java.runtime/Contents/Home/bin里——如果你有特殊需求的话,上面的方案都能满足。
内容的提问来源于stack exchange,提问作者cbm64

