【教程】如何将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 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
#### 完
### 三、检验JAR包完整性
编译、打包,在对应的输出目录下会出现两个jar包,一个包含完整的第三方依赖包库,一个不包含,后者只能在本地环境运行。
直接控制台启动jar包
校验下对应的功能正常不正常,如果缺失了依赖包会提示没有找到对应的类。 打包后的文件这么小挺意外的,真的可以在没有Java环境的系统里运行吗? 感谢分享,学习了 hrpzcf 发表于 2022-9-2 12:47
打包后的文件这么小挺意外的,真的可以在没有Java环境的系统里运行吗?
集成 jre 的话 体积会大很多,
也可以不集成, 运行的时候依赖系统的 jre hrpzcf 发表于 2022-9-2 12:47
打包后的文件这么小挺意外的,真的可以在没有Java环境的系统里运行吗?
不好意思,写得不是特别严谨,已经订正,意思是修改exe读取的jre路径,目前好像没发现可以直接一个exe包含jre的方法。 如果不包含jre叫普通人安装也没什么意义, 这都是妥协的方案, 可以试试 Graalvm Native Build 支持 Linux Mac Win
案例 https://github.com/zhengchalei/vertx-kotlin-graal 收藏了,以后学java再用:lol