美文网首页
【转载】java打包exe方案(自动携带jre)

【转载】java打包exe方案(自动携带jre)

作者: andycheng | 来源:发表于2023-02-12 10:57 被阅读0次

    java打包exe方案(自动携带jre)

    java的项目一般都是以jar发布,很少打包为可执行程序,因此常见的打包方式也不多,且即使打包之后也需要jre环境才能运行,大部分打包都不会携带jre,需要手动添加jre。这里介绍几种我用过的打包方案。

    • exe4j(不推荐)
    • jpackage
    • go加密打包再套壳

    exe4j打包

    exe4j打包最为简单,网上教程很多,这里不做多的赘述,虽然打包简单,但是缺点也很明显。

    • 打包时虽然指定了jre路径,但是打包之后不会自动携带jre,也就是打包之后还要将对应的jre和exe一起发给么有jre环境的电脑才能使用。
    • exej4打包后每次运行都会将jar作为临时文件,且结束运行后不会自动删除临时文件,导致产生很多临时文件。

    jpackage

    jpackag是java自己的打包方式,缺点是需要java9及以上才能用。这里简单介绍一下如果打包,以springboot生成的jar为例。

    pom文件引入maven打包工具

        <build>
            <finalName>drawing</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
     
            </plugins>
        </build>
    
    image.png

    点击package之后生成可执行的jar,确保是能正常运行的jar之后即可执行打包命名

    jpackage -i test -n excel快速出图工具 --type "msi" --win-dir-chooser --win-menu --win-shortcut --win-console --main-jar xdrawing.jar
    

    命名说明
    -i:需要打包的文件夹,如jar所在的目录,例子中取得是test文件夹。
    -n:打包后的文件名
    -type:类型,这里取得是msi文件
    -main-jar:需要打包的jar
    其他的几个参数是打包windows时的特性,打包其他平台时用其他平台的特性即可。

    这里只是做简单的例子,具体如参数参考 The jpackage Command

    • jpackage打包的执行文件包含了一个精简版的jre,直接将可执行程序发给没有jre环境的电脑也可用。
    • 目前笔者还不知道jpackage打包的jar能否加密,因此如果希望jar是被加密后再打包的话,这面推荐一种方式。go加密打包再套上壳。

    go加密打包再套壳

    jar很容易被反编译,jar的加密大致分为两种模式,有机会后续介绍,这里说一种对称加密的方式——xjar(XJar: XJar — Spring-Boot JAR 包加密运行工具,避免源码泄露以及反编译 (gitee.com))。

    新建一个maven项目。加入对应的依赖。

        <!-- 设置 jitpack.io 仓库 -->
        <repositories>
            <repository>
                <id>jitpack.io</id>
                <url>https://jitpack.io</url>
            </repository>
        </repositories>
        <!-- 添加 XJar 依赖 -->
        <dependencies>
            <dependency>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar</artifactId>
                <version>4.0.2</version>
                <!-- <scope>test</scope> -->
            </dependency>
        </dependencies>
    

    写个测试main函数开始加密。这里直接取得官网的例子,可取上面的官网看各个参数意思。

    public class Test {
        public static void main(String[] args) throws Exception {
            XCryptos.encryption()
                    .from("H:\\绘图\\test\\drawing.jar")
                    .use("io.xjar")
                    .include("/io/xjar/**/*.class")
                    .include("/mapper/**/*Mapper.xml")
                    .exclude("/static/**/*")
                    .exclude("/conf/*")
                    .to("H:\\绘图\\test\\xdrawing.jar");
        }
    }
    

    执行后只要会生成一个加密后的jar xdrawing.jar (该jar 是需要密匙才能反编译)和xjar.go文件(xjare.exe文件为后续编译文件,jre文件是为后续步骤准备的文件)


    在有go环境的电脑上在当前路径执行如下命令,就会生成xjar.exe文件。

    go build xjar.go
    

    在当前窗口执行如下命令即可启动jar

    xjar.exe java -jar xdrawing.jar
    

    笔者这里为了方便后续加壳,复制了一个jre环境,因此运行的命令如下

    xjar.exe .\jre\bin\java -jar xdrawing.jar
    

    启动后如下


    image.png

    此时jar是加密的,需要借助go编译的exe文件才能启动,且还是需要jre环境才能运行。但是对xjar.exe再套上一个壳的话,将jre环境包括进来,即可实现一个安装文件包含jre。

    原来的go.exe 需要加上参数才能启动jar,这面我们对go文件做一下简单的更改,实现自动携带参数。原文件是从路径中取的值。

    image.png

    这里我们做一下简单的调整,将几个输入值写为固定值即可


    image.png

    重新编译之后直接双击xjar.exe即可启动对应的jar文件。

    利用inno setup加壳

    下载地址 Inno Setup (jrsoftware.org)

    使用教程网上有很多,这里截一张主要的图,将包含jre和的路径添加进去即可。

    image.png

    加壳之后生成对应的文件


    image.png

    双击安装之后 即可运行。打开安装目录之后发现包含了我们的jre环境


    image.png

    ————————————————
    版权声明:本文为CSDN博主「大大瓜先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qazxcvbnm_/article/details/128303083

    相关文章

      网友评论

          本文标题:【转载】java打包exe方案(自动携带jre)

          本文链接:https://www.haomeiwen.com/subject/lfcdkdtx.html