Maven、JavaFX、Launch4J-Maven-plugin - 如何捆绑 JRE?
Maven, JavaFX, Launch4J-Maven-plugin - How to bundle a JRE?
我正在使用 maven 和 openJDK 12 在 JavaFX 中构建一个小应用程序。但是,我需要我的 .Jar 包含一个捆绑的 JRE,这样它就可以 运行 on windows OS 而无需下载合适的 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 来使用它。有人会帮助我吗?我也需要它来工作,因为在 users/clients 台计算机上执行 javaFX 很痛苦。
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>
相关 SOF 主题:
Bundle a JRE into an exe using Launch4J
https://openjfx.io/openjfx-docs/#install-javafx
https://github.com/lukaszlenart/launch4j-maven-plugin/blob/master/src/main/resources/README.adoc
这在 30 天内被浏览了 108 次。因此,我将 post 我找到并正在使用的解决方案。
我遵循了用户 'José Pereda' 在
的解决方案
使用 OpenJFX 和 https://github.com/beryx/badass-runtime-plugin
但是,在这个答案中,我展示了一些对我来说不太清楚的选项,我敢打赌,对于开始使用 JavaFX 的学生或开发人员来说,这并不清楚:
在 javaFX 中添加了模块{}:模块 = [
'javafx.controls','javafx.graphics', 'javafx.fxml' ] 避免
jPackage 完成创建时的编译错误和失败
设置。
设置变量jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'指出jPackage在哪。当您使用另一个 JDK 作为其他项目的主要构建或 IDE 本身时,这很有用。这是我的情况。
imageOptions = ['--icon', 'src/main/resources/images/logo.ico'] 正确设置图标。我不知道 windows 需要 .ico 而不是 .png
compileJava.options.encoding 因为我用的是拉丁符号,所以我的好几个文件都坏了。
我希望这些技巧连同 Jose pereda 的回答能为 JavaFx 迷路或不熟悉的其他人节省时间。
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
}
repositories {
mavenCentral()
}
ext {
openJfxVersion = '13'
}
dependencies {
compile 'org.openjfx:javafx-base:${openJfxVersion}:win'
compile 'org.openjfx:javafx-controls:${openJfxVersion}:win'
compile 'org.openjfx:javafx-graphics:${openJfxVersion}:win'
compile 'org.openjfx:javafx-fxml:13'
}
javafx {
version = "13"
modules = [ 'javafx.controls','javafx.graphics', 'javafx.fxml' ]
}
mainClassName = 'Main'
runtime {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
jpackage {
jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'
if(org.gradle.internal.os.OperatingSystem.current().windows) {
installerType = 'msi'
imageOptions = ['--icon', 'src/main/resources/images/logo.ico']
installerOptions = ['--win-per-user-install',
'--win-dir-chooser',
'--win-menu',
'--win-shortcut',
'--verbose',
'--description','x ',
'--name', 'x',
'--vendor','x',
'--win-upgrade-uuid','x']
}
}
}
compileJava {
compileJava.options.encoding = 'ISO-8859-1'
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
group = 'br.x'
version = '0.1'
tasks.withType(JavaCompile) {
options.encoding = 'ISO-8859-1'
}
<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.howtodoinjava</groupId>
<artifactId>JavaExeDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>JavaExeDemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>shaded</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.howtodoinjava.Main</mainClass>
</transformer>
</transformers>
</configuration>
</plugin>
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<jar>${project.build.directory}/${artifactId}-${version}-shaded.jar</jar>
<outfile>${project.build.directory}/howtodoinjava.exe</outfile>
<downloadUrl>http://java.com/download</downloadUrl>
<classPath>
<mainClass>com.howtodoinjava.ApplicationMain</mainClass>
<preCp>anything</preCp>
</classPath>
<icon>application.ico</icon>
<jre>
<minVersion>1.6.0</minVersion>
<jdkPreference>preferJre</jdkPreference>
</jre>
<versionInfo>
<fileVersion>1.0.0.0</fileVersion>
<txtFileVersion>${project.version}</txtFileVersion>
<fileDescription>${project.name}</fileDescription>
<copyright>2012 howtodoinjava.com</copyright>
<productVersion>1.0.0.0</productVersion>
<txtProductVersion>1.0.0.0</txtProductVersion>
<productName>${project.name}</productName>
<companyName>howtodoinjava.com</companyName>
<internalName>howtodoinjava</internalName>
<originalFilename>howtodoinjava.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我正在使用 maven 和 openJDK 12 在 JavaFX 中构建一个小应用程序。但是,我需要我的 .Jar 包含一个捆绑的 JRE,这样它就可以 运行 on windows OS 而无需下载合适的 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 来使用它。有人会帮助我吗?我也需要它来工作,因为在 users/clients 台计算机上执行 javaFX 很痛苦。
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>
相关 SOF 主题:
Bundle a JRE into an exe using Launch4J
https://openjfx.io/openjfx-docs/#install-javafx
https://github.com/lukaszlenart/launch4j-maven-plugin/blob/master/src/main/resources/README.adoc
这在 30 天内被浏览了 108 次。因此,我将 post 我找到并正在使用的解决方案。
我遵循了用户 'José Pereda' 在
使用 OpenJFX 和 https://github.com/beryx/badass-runtime-plugin
但是,在这个答案中,我展示了一些对我来说不太清楚的选项,我敢打赌,对于开始使用 JavaFX 的学生或开发人员来说,这并不清楚:
在 javaFX 中添加了模块{}:模块 = [ 'javafx.controls','javafx.graphics', 'javafx.fxml' ] 避免 jPackage 完成创建时的编译错误和失败 设置。
设置变量jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'指出jPackage在哪。当您使用另一个 JDK 作为其他项目的主要构建或 IDE 本身时,这很有用。这是我的情况。
imageOptions = ['--icon', 'src/main/resources/images/logo.ico'] 正确设置图标。我不知道 windows 需要 .ico 而不是 .png
compileJava.options.encoding 因为我用的是拉丁符号,所以我的好几个文件都坏了。
我希望这些技巧连同 Jose pereda 的回答能为 JavaFx 迷路或不熟悉的其他人节省时间。
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'org.beryx.runtime' version '1.7.0'
id "com.github.johnrengelman.shadow" version "5.1.0"
}
repositories {
mavenCentral()
}
ext {
openJfxVersion = '13'
}
dependencies {
compile 'org.openjfx:javafx-base:${openJfxVersion}:win'
compile 'org.openjfx:javafx-controls:${openJfxVersion}:win'
compile 'org.openjfx:javafx-graphics:${openJfxVersion}:win'
compile 'org.openjfx:javafx-fxml:13'
}
javafx {
version = "13"
modules = [ 'javafx.controls','javafx.graphics', 'javafx.fxml' ]
}
mainClassName = 'Main'
runtime {
options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
jpackage {
jpackageHome = 'C:/Program Files/Java/openjdk-14-jpackage+1-49_windows-x64_bin/'
if(org.gradle.internal.os.OperatingSystem.current().windows) {
installerType = 'msi'
imageOptions = ['--icon', 'src/main/resources/images/logo.ico']
installerOptions = ['--win-per-user-install',
'--win-dir-chooser',
'--win-menu',
'--win-shortcut',
'--verbose',
'--description','x ',
'--name', 'x',
'--vendor','x',
'--win-upgrade-uuid','x']
}
}
}
compileJava {
compileJava.options.encoding = 'ISO-8859-1'
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
group = 'br.x'
version = '0.1'
tasks.withType(JavaCompile) {
options.encoding = 'ISO-8859-1'
}
<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.howtodoinjava</groupId>
<artifactId>JavaExeDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>JavaExeDemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>shaded</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.howtodoinjava.Main</mainClass>
</transformer>
</transformers>
</configuration>
</plugin>
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<jar>${project.build.directory}/${artifactId}-${version}-shaded.jar</jar>
<outfile>${project.build.directory}/howtodoinjava.exe</outfile>
<downloadUrl>http://java.com/download</downloadUrl>
<classPath>
<mainClass>com.howtodoinjava.ApplicationMain</mainClass>
<preCp>anything</preCp>
</classPath>
<icon>application.ico</icon>
<jre>
<minVersion>1.6.0</minVersion>
<jdkPreference>preferJre</jdkPreference>
</jre>
<versionInfo>
<fileVersion>1.0.0.0</fileVersion>
<txtFileVersion>${project.version}</txtFileVersion>
<fileDescription>${project.name}</fileDescription>
<copyright>2012 howtodoinjava.com</copyright>
<productVersion>1.0.0.0</productVersion>
<txtProductVersion>1.0.0.0</txtProductVersion>
<productName>${project.name}</productName>
<companyName>howtodoinjava.com</companyName>
<internalName>howtodoinjava</internalName>
<originalFilename>howtodoinjava.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>