当前位置: 首页 > 知识库问答 >
问题:

Maven,JavaFX,Launch4J-Maven-plugin-如何捆绑一个JRE?

许博易
2023-03-14

我正在使用maven和OpenJDK12在JavaFX中构建一个小应用程序。但是,我需要我的.jar包含一个捆绑的JRE,这样它就可以在windows OS上运行,而不需要下载适当的JRE。

Im也使用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来使用它。有人能帮我吗?我还需要这样做,因为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主题:

    如何使JRE与Launch4J捆绑?

    使用Launch4J将JRE绑定到exe中

    https://openjfx.io/openjfx-docs/#安装-javafx

    https://github.com/lukaszlenart/launch4j-maven-plugin/blob/master/src/main/resources/readme.adoc

  • 共有1个答案

    姚宪
    2023-03-14

    这在30天内被观看了108次。所以我将发布我找到的解决方案,我现在正在使用。

    我在https://stackoverflow.com/A/54065502/2280645跟踪了用户'JoséPereda'的解决方案

    使用OpenJFX和https://github.com/beryx/badass-runtime-plugin

    然而,在这个答案中,我展示了一些对我来说并不清楚的选项,我敢打赌,对于学生或从JavaFX开始的开发人员来说也不清楚:

    >

  • 在javaFX中添加了模块{}:Modules=['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或刚接触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'
    }
    

  •  类似资料:
    • 顾名思义,这是 Maven 的 Launch4j 的插件,用来提供在 Maven 直接将 Java 项目打包成可执行文件。

    • 但程序没有启动。它显示了一个会立即消失的小对话框(看起来是空白的,但它消失得太快了,以至于我没有真正注意到它)。

    • 问题内容: 我了解launch4j不会将JRE捆绑在中,但是您必须将其放置在它旁边。我的问题是,我应该怎么做?Maven是否有一种方法可以自动找到并复制我用来构建应用程序的JDK的JRE并将其复制到给定目录? 我试图做这样的事情: 但是程序无法启动。它显示了一个小对话框,该对话框立即消失了(它似乎是空白的,但是消失得太快了,我无法真正注意到它)。 问题答案: 更新:删除了我以前的答案,并用经过测试

    • 问题内容: 我有一个Maven OSGi多模块项目。当OSGi从各个项目模块中选择模块jar时,该项目将运行良好。 (请参见下面的1.1.B) 。 但是,使用第二种方法,每当我尝试使用通过maven-assembly- plugin版本2.6 放置到中央文件夹 (D:/ parent / provider / target / modules)* 中的捆绑包时, (请参见下面的1.1.A)都 将返

    • 我正在做一个类项目,需要使用Maven作为JavaFx项目的构建工具。 这是我的pom.xml设置,我在其中使用了2个插件。根据我的理解:是强制java jdk 1.8作为编译器,是自动下载javafx库。 另外,我的主启动器main.java文件位于。与文件夹处于同一级别。 然而,编译总是失败。 我不知道哪一步错了...任何想法都将不胜感激。

    • 我正在使用maven-shade-plugin在构建的包阶段重新定位一些包。我还使用maven-bundle-plugin生成一个清单。问题是bundle插件在shade插件之前运行(在过程类阶段),并且在生成的清单的导出中没有包含任何我的shade包。 -- 根据要求,我的POM的阴影和捆绑部分: 从这里取的