我正在使用maven和openJDK 12构建一个小型JavaFX应用程序。然而,我需要将我的.jar文件打包为含有bundled JRE的文件,以便在Windows操作系统上运行,而无需下载适当的JRE。
我还使用了launch4j-maven-plugin插件。我在SOF上尝试了几个解决方案,但都没有成功。有些主题提到了maven-shade-plugin,但对我并没有起作用。我无法将外部文件夹打包进去。
目前我的POM可以部分完成任务:
- 它将"C:/Program Files/Java/openjdk-12.0.2_windows-x64_bin/bin"文件夹打包到.jar文件中,但是".exes"未包含在内,这很糟糕。 - 它将POM的依赖项打包到.jar文件中。 - launcher4j-maven将它们全部打包成一个.exe文件。
我想要的是将JRE打包到.jar文件中,并设置launcher4J来使用它。是否必须将JRE放在.exe文件之外?如果是的话,那么我该如何设置maven来实现呢?
我还使用了launch4j-maven-plugin插件。我在SOF上尝试了几个解决方案,但都没有成功。有些主题提到了maven-shade-plugin,但对我并没有起作用。我无法将外部文件夹打包进去。
目前我的POM可以部分完成任务:
- 它将"C:/Program Files/Java/openjdk-12.0.2_windows-x64_bin/bin"文件夹打包到.jar文件中,但是".exes"未包含在内,这很糟糕。 - 它将POM的依赖项打包到.jar文件中。 - launcher4j-maven将它们全部打包成一个.exe文件。
我想要的是将JRE打包到.jar文件中,并设置launcher4J来使用它。是否必须将JRE放在.exe文件之外?如果是的话,那么我该如何设置maven来实现呢?
<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>br.sky</groupId>
<artifactId>Maven-FX</artifactId>
<version>2.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics </artifactId>
<version>11.0.2</version>
<classifier>win</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx</artifactId>
<version>11.0.2</version>
<type>pom</type>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>**/application.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/JRE</outputDirectory>
<resources>
<resource>
<directory>C:/Program Files/Java/openjdk-12.0.2_windows-x64_bin/bin</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.3</version>
<configuration>
<mainClass>br.sky.main.Main</mainClass>
<executable>C:\Program Files\Java\openjdk-12.0.2_windows-x64_bin\bin\java.exe</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>br.sky.main.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>exe</nonFilteredFileExtension>
<nonFilteredFileExtension>dll</nonFilteredFileExtension>
</nonFilteredFileExtensions>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>br.sky.main.Main</mainClass>
</manifest>
</archive>
<fileSet>
<directory>${basedir}/target/JRE</directory>
<outputDirectory>/jre/</outputDirectory>
<includes>
<include>/jre</include>
</includes>
</fileSet>
</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>
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.7.25</version>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<outfile>${project.build.directory}/${project.artifactId}-${project.version}.exe</outfile>
<jar>${project.build.directory}/${project.artifactId}-${project.version}-jar-with-dependencies.jar</jar>
<errTitle>Maven FX</errTitle>
<classPath>
<mainClass>br.sky.main.Main</mainClass>
<addDependencies>true</addDependencies>
</classPath>
<jre>
<path>./jre</path>
<minVersion>11.0.1</minVersion>
</jre>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
相关的 Stack Overflow 主题:
https://openjfx.io/openjfx-docs/#install-javafx
https://github.com/lukaszlenart/launch4j-maven-plugin/blob/master/src/main/resources/README.adoc
mvn javafx:jlink
?(如果还没有module-info
描述符,你将需要它)。如果由于某些非模块依赖项而无法工作,我肯定会选择jpackage
(即使是早期访问)。 - José Pereda