如何让 JRE 与 launch4j 捆绑在一起?
How to get the JRE to bundle with launch4j?
我知道 launch4j 没有将 JRE 捆绑在 .exe
中,但您必须将它放在它旁边。我的问题是,我该怎么做?有没有办法让 Maven 自动定位和复制我用来构建我的应用程序的 JDK 的 JRE 并将其复制到给定目录?
我试过这样做:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/windows/jre</outputDirectory>
<resources>
<resource>
<directory>${java.home}</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
但是程序没有启动。它显示了一个立即消失的小对话框(它似乎是空白的,但它消失得太快以至于我没有真正注意到它)。
更新:删除了我之前的答案并替换为经过测试的工作示例
更新 2:这个 pom.xml 现在下载 JRE tgz 并解压它,launch4j exe 使用它并且它可以工作。我添加了评论来解释它是如何工作的。
我建议坚持使用 32 位 exe 和 JRE。使用 64 位 JRE 的唯一原因是您的程序需要使用超过 4 GB 的 RAM。
当然,现在您需要一个安装程序来处理所有这些并安装到 Program Files。我过去曾为此使用过 NSIS。 NSIS 有一个学习曲线,但还算不错。
<?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>com.akathist.encc</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- This is the win32 JRE tgz hosted by alfresco - https://mvnrepository.com/artifact/com.oracle.java/jre -->
<dependency>
<groupId>com.oracle.java</groupId>
<artifactId>jre</artifactId>
<classifier>win32</classifier>
<type>tgz</type>
<version>1.8.0_131</version>
</dependency>
</dependencies>
<repositories>
<repository>
<!-- this repository has the JRE tgz -->
<id>alfresco</id>
<url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<!-- this is to extract the JRE tgz file we downloaded -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>com.oracle.java</includeGroupIds>
<includeTypes>tgz</includeTypes>
<includeArtifactIds>jre</includeArtifactIds>
<includeClassifiers>win32</includeClassifiers>
<outputDirectory>target/win32</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- This calls launch4j to create the program EXE -->
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>console</headerType>
<outfile>target/encc.exe</outfile>
<jar>target/mavenproject1-1.0-SNAPSHOT.jar</jar>
<errTitle>encc</errTitle>
<classPath>
<mainClass>com.akathist.encc.Clui</mainClass>
<addDependencies>false</addDependencies>
<preCp>anything</preCp>
</classPath>
<jre>
<path>./win32/java</path>
</jre>
<versionInfo>
<fileVersion>1.2.3.4</fileVersion>
<txtFileVersion>txt file version?</txtFileVersion>
<fileDescription>a description</fileDescription>
<copyright>my copyright</copyright>
<productVersion>4.3.2.1</productVersion>
<txtProductVersion>txt product version</txtProductVersion>
<productName>E-N-C-C</productName>
<internalName>ccne</internalName>
<originalFilename>original.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
更新 3:可悲的事实是,没有官方甚至 up-to-date maven 存储库包含您想要的 JRE。您可以托管具有所需 JRE 的自己的 Maven 存储库。随着新版本的发布,您将不得不更新它。在发布之前测试新版本也是一个好主意。每个月的第三个星期二是完成新 Java 发布的时间。您可以为此设置提醒,以检查是否有新版本发布并下载。由于许可协议检查,自动化这很痛苦。 post 可能会有所帮助,但您可能无法通过以下方式下载 JRE 的 tar.gz 版本:Java check latest version programmatically
如果您想支持多个平台,那么托管您自己的 Maven 存储库是一个不错的选择。您可以托管自己的存储库并在每次发布时使用新的 JRE tar.gz 更新它:
最简单的选择是完成您的目标,只使用您正在构建的 JRE。只要您使用 32 位 JRE 构建,这将允许您支持 Windows 32 和 64。当您有时间使用新版本进行测试时,您可以偶尔更新它。这是一个可以执行此操作的 pom.xml:
<?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>com.akathist.encc</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<!-- This copies the JRE used to do the build from java.home - should be 32 bit Windows JRE -->
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/win32/java</outputDirectory>
<resources>
<resource>
<directory>${java.home}</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- This calls launch4j to create the program EXE -->
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>console</headerType>
<outfile>target/encc.exe</outfile>
<jar>target/mavenproject1-1.0-SNAPSHOT.jar</jar>
<errTitle>encc</errTitle>
<classPath>
<mainClass>com.akathist.encc.Clui</mainClass>
<addDependencies>false</addDependencies>
<preCp>anything</preCp>
</classPath>
<jre>
<path>./win32/java</path>
</jre>
<versionInfo>
<fileVersion>1.2.3.4</fileVersion>
<txtFileVersion>txt file version?</txtFileVersion>
<fileDescription>a description</fileDescription>
<copyright>my copyright</copyright>
<productVersion>4.3.2.1</productVersion>
<txtProductVersion>txt product version</txtProductVersion>
<productName>E-N-C-C</productName>
<internalName>ccne</internalName>
<originalFilename>original.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我相信这就是您要找的:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
...
<configuration>
...
<jre>
<path>${java.home}</path> <!-- SEE THIS -->
</jre>
...
</configuration>
</execution>
</executions>
</plugin>
Java 允许您使用 java.home
系统 属性 访问 JRE 路径。你可以 access java system properties within pom。你有一个包装 launch4j 的插件。把所有这些放在一起,你就有了解决方案。
我知道 launch4j 没有将 JRE 捆绑在 .exe
中,但您必须将它放在它旁边。我的问题是,我该怎么做?有没有办法让 Maven 自动定位和复制我用来构建我的应用程序的 JDK 的 JRE 并将其复制到给定目录?
我试过这样做:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/windows/jre</outputDirectory>
<resources>
<resource>
<directory>${java.home}</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
但是程序没有启动。它显示了一个立即消失的小对话框(它似乎是空白的,但它消失得太快以至于我没有真正注意到它)。
更新:删除了我之前的答案并替换为经过测试的工作示例
更新 2:这个 pom.xml 现在下载 JRE tgz 并解压它,launch4j exe 使用它并且它可以工作。我添加了评论来解释它是如何工作的。
我建议坚持使用 32 位 exe 和 JRE。使用 64 位 JRE 的唯一原因是您的程序需要使用超过 4 GB 的 RAM。
当然,现在您需要一个安装程序来处理所有这些并安装到 Program Files。我过去曾为此使用过 NSIS。 NSIS 有一个学习曲线,但还算不错。
<?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>com.akathist.encc</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- This is the win32 JRE tgz hosted by alfresco - https://mvnrepository.com/artifact/com.oracle.java/jre -->
<dependency>
<groupId>com.oracle.java</groupId>
<artifactId>jre</artifactId>
<classifier>win32</classifier>
<type>tgz</type>
<version>1.8.0_131</version>
</dependency>
</dependencies>
<repositories>
<repository>
<!-- this repository has the JRE tgz -->
<id>alfresco</id>
<url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<!-- this is to extract the JRE tgz file we downloaded -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeGroupIds>com.oracle.java</includeGroupIds>
<includeTypes>tgz</includeTypes>
<includeArtifactIds>jre</includeArtifactIds>
<includeClassifiers>win32</includeClassifiers>
<outputDirectory>target/win32</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- This calls launch4j to create the program EXE -->
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>console</headerType>
<outfile>target/encc.exe</outfile>
<jar>target/mavenproject1-1.0-SNAPSHOT.jar</jar>
<errTitle>encc</errTitle>
<classPath>
<mainClass>com.akathist.encc.Clui</mainClass>
<addDependencies>false</addDependencies>
<preCp>anything</preCp>
</classPath>
<jre>
<path>./win32/java</path>
</jre>
<versionInfo>
<fileVersion>1.2.3.4</fileVersion>
<txtFileVersion>txt file version?</txtFileVersion>
<fileDescription>a description</fileDescription>
<copyright>my copyright</copyright>
<productVersion>4.3.2.1</productVersion>
<txtProductVersion>txt product version</txtProductVersion>
<productName>E-N-C-C</productName>
<internalName>ccne</internalName>
<originalFilename>original.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
更新 3:可悲的事实是,没有官方甚至 up-to-date maven 存储库包含您想要的 JRE。您可以托管具有所需 JRE 的自己的 Maven 存储库。随着新版本的发布,您将不得不更新它。在发布之前测试新版本也是一个好主意。每个月的第三个星期二是完成新 Java 发布的时间。您可以为此设置提醒,以检查是否有新版本发布并下载。由于许可协议检查,自动化这很痛苦。 post 可能会有所帮助,但您可能无法通过以下方式下载 JRE 的 tar.gz 版本:Java check latest version programmatically
如果您想支持多个平台,那么托管您自己的 Maven 存储库是一个不错的选择。您可以托管自己的存储库并在每次发布时使用新的 JRE tar.gz 更新它:
最简单的选择是完成您的目标,只使用您正在构建的 JRE。只要您使用 32 位 JRE 构建,这将允许您支持 Windows 32 和 64。当您有时间使用新版本进行测试时,您可以偶尔更新它。这是一个可以执行此操作的 pom.xml:
<?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>com.akathist.encc</groupId>
<artifactId>mavenproject1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<!-- This copies the JRE used to do the build from java.home - should be 32 bit Windows JRE -->
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/win32/java</outputDirectory>
<resources>
<resource>
<directory>${java.home}</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!-- This calls launch4j to create the program EXE -->
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
<id>l4j-clui</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>console</headerType>
<outfile>target/encc.exe</outfile>
<jar>target/mavenproject1-1.0-SNAPSHOT.jar</jar>
<errTitle>encc</errTitle>
<classPath>
<mainClass>com.akathist.encc.Clui</mainClass>
<addDependencies>false</addDependencies>
<preCp>anything</preCp>
</classPath>
<jre>
<path>./win32/java</path>
</jre>
<versionInfo>
<fileVersion>1.2.3.4</fileVersion>
<txtFileVersion>txt file version?</txtFileVersion>
<fileDescription>a description</fileDescription>
<copyright>my copyright</copyright>
<productVersion>4.3.2.1</productVersion>
<txtProductVersion>txt product version</txtProductVersion>
<productName>E-N-C-C</productName>
<internalName>ccne</internalName>
<originalFilename>original.exe</originalFilename>
</versionInfo>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我相信这就是您要找的:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<executions>
<execution>
...
<configuration>
...
<jre>
<path>${java.home}</path> <!-- SEE THIS -->
</jre>
...
</configuration>
</execution>
</executions>
</plugin>
Java 允许您使用 java.home
系统 属性 访问 JRE 路径。你可以 access java system properties within pom。你有一个包装 launch4j 的插件。把所有这些放在一起,你就有了解决方案。