haodadeyu 发表于 2022-9-2 10:36

【教程】如何将JAVA代码转成可执行的exe文件直接发布给其它人使用

### 前置准备
1、电脑需要安装并配置JAVA开发环境
2、电脑需要下载安装JAR包转EXE工具
3、需要了解最基础的JAVA开发知识和,MAVEN项目构建知识

### 一、创建一个MAVEN工程
本次示范的DEMO功能要实现的功能非常简单,将一个文件夹下的文件的内容挨个复制,合并到一个文本中。
全部代码如下:
```java
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;

import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws InterruptedException {
      while (true) {
            try {
                String inputFolder;
                Scanner sc = new Scanner(System.in);
                if (args.length >= 1) {
                  inputFolder = args;
                } else {
                  print("请输入需要合并的文本所在文件夹的目录(如 C:\\Users\\admin\\Desktop\\log)", Ansi.Color.CYAN);
                  inputFolder = sc.next();
                }
                File folder;
                while (true) {
                  folder = new File(inputFolder);
                  if (!folder.exists() || !folder.isDirectory()) {
                        print("输入的不是一个文件夹路径或该文件夹不存在,请重新输入", Ansi.Color.RED);
                        inputFolder = sc.next();
                  } else {
                        break;
                  }
                }
                File output = new File(folder.getParent() + File.separator + "output.txt");
                if (!output.exists()) {
                  output.createNewFile();
                }
                BufferedWriter bw = new BufferedWriter(new FileWriter(output));
                File[] fs = folder.listFiles();
                for (int i = 0; i < fs.length; i++) {
                  BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fs), "UTF-8"));
                  String line;
                  while ((line = br.readLine()) != null) {
                        bw.write(line);
                        bw.newLine();
                  }
                  br.close();
                }
                bw.close();
                print("合并完毕,合并的文本所在目录:" + output.getAbsolutePath(), Ansi.Color.GREEN);
            } catch (IOException o) {
                print("发生io异常,已终止程序", Ansi.Color.RED);
                o.printStackTrace();
                Thread.sleep(10000);
                return;
            }
      }
    }

    public static Ansi formatStr(String content, Ansi.Color colour) {
      return Ansi.ansi().fg(colour).a(content);
    }

    public static void print(String content, Ansi.Color colour) {
      AnsiConsole.systemInstall();
      System.out.println(formatStr(content, colour));
      AnsiConsole.systemUninstall();
    }
   
}
````
### 二、MAVEN打包配置
DEMO中引入了第三方的jar包,我们等下转成exe需要我们的jar包是带了完整库的,否则在别的环境运行会因为没有库报错,所以maven需要配置把第三方jar包一块打进去。
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>org.52pojie</groupId>
    <artifactId>merge</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
      <maven.compiler.source>8</maven.compiler.source>
      <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
      <dependency>
            <groupId>org.fusesource.jansi</groupId>
            <artifactId>jansi</artifactId>
            <version>2.1.1</version>
      </dependency>
    </dependencies>

    <build>
      <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                  <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>Main</mainClass> <!-- 此处为主入口main的路径-->
                        </manifest>
                  </archive>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                  <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
                  <archive>
                        <manifest>
                            <!--自己的主类路径-->
                            <mainClass>Main</mainClass>
                        </manifest>
                  </archive>
                </configuration>
                <executions>
                  <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                  </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                  <source>8</source>
                  <target>8</target>
                </configuration>
            </plugin>
      </plugins>
    </build>

</project>

```

haodadeyu 发表于 2022-9-2 11:47

本帖最后由 haodadeyu 于 2022-9-2 15:32 编辑

### 四、将jar包转成exe
需要预先安装转换工具exe4j,可直接到官网***https://exe4j.apponic.com***下载,安装过程和破解过程请自行搜索,网上有很多licence。

安装完毕后打开工具 除了下列截图内容外其它都可以默认设置。
#### 1、设置输出路径

#### 2、这里可以选择转换生成的exe的图标

#### 3、生成64位兼容的exe程序,否则程序在64位机器上运行可能会闪退

#### 4、设置源程序jar包,导入上一步中生成的完整jar包,勾选对应的主函数入口





#### 5、设置jre和exe相对路径,在其它机器上会读取该文件夹作为jre源




#### 6、生成可执行的exe


#### 完

haodadeyu 发表于 2022-9-2 10:48

### 三、检验JAR包完整性
编译、打包,在对应的输出目录下会出现两个jar包,一个包含完整的第三方依赖包库,一个不包含,后者只能在本地环境运行。

直接控制台启动jar包

校验下对应的功能正常不正常,如果缺失了依赖包会提示没有找到对应的类。

hrpzcf 发表于 2022-9-2 12:47

打包后的文件这么小挺意外的,真的可以在没有Java环境的系统里运行吗?

jerry828 发表于 2022-9-2 13:59

感谢分享,学习了

Vvvvvoid 发表于 2022-9-2 13:17

hrpzcf 发表于 2022-9-2 12:47
打包后的文件这么小挺意外的,真的可以在没有Java环境的系统里运行吗?

集成 jre 的话 体积会大很多,
也可以不集成, 运行的时候依赖系统的 jre

haodadeyu 发表于 2022-9-2 15:28

hrpzcf 发表于 2022-9-2 12:47
打包后的文件这么小挺意外的,真的可以在没有Java环境的系统里运行吗?

不好意思,写得不是特别严谨,已经订正,意思是修改exe读取的jre路径,目前好像没发现可以直接一个exe包含jre的方法。

海是倒过来的天 发表于 2022-9-2 15:46

如果不包含jre叫普通人安装也没什么意义,

萋小磊 发表于 2022-9-2 15:49

这都是妥协的方案, 可以试试 Graalvm Native Build 支持 Linux Mac Win
案例 https://github.com/zhengchalei/vertx-kotlin-graal

l1laoba888 发表于 2022-9-2 16:43

收藏了,以后学java再用:lol
页: [1] 2 3
查看完整版本: 【教程】如何将JAVA代码转成可执行的exe文件直接发布给其它人使用