Java Swing 代码打包成 Windows 上的 exe 文件

年前抽空给朋友做了个小东西。具体功能就不说了。对于他的最终需求,概括的说就是:需要一个满足功能的在 windows 上的 .exe 文件。桌面开发我不熟,后来基于 Java Swing 给实现了。在实现过程中,几个关键点记下来做备忘。

  1. 拖拽文件到界面的输入框中,后续对文件进行处理。简化一下,拖拽文件到输入框,并获取文件路径。
  2. 项目的依赖是用 Gradle 来管理的,功能实现依赖第三方 jar,最终需要打包成一个可执行 jar。
  3. 将制作好的 jar 打包成 .exe 文件。

1. 实现拖拽文件到指定控件,并获取文件路径

直接上核心代码,具体看注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;

/**
* 拖拽文件到控件,并处理
* @param component 要接受拖拽的控件
*/
private void drag(Component component) {

new DropTarget(component, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetAdapter() {

// 重写适配器的drop方法,实现自己需要的逻辑
@Override
public void drop(DropTargetDropEvent event) {
try {
// 如果拖入的文件格式受支持
if (event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
// 接收拖拽来的数据
event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
// 读取传递过来的数据
java.util.List<File> list = (java.util.List<File>) (event.getTransferable().getTransferData(DataFlavor.javaFileListFlavor));
// 对传递过来的数据做处理
// do what you want to do
event.dropComplete(true); // 指示拖拽操作已完成
} else {
event.rejectDrop(); // 否则拒绝拖拽来的数据
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

2. 通过 Gradle 制作可执行的 jar 文件

参考这里:Creating runnable JAR with Gradle

里面提到了两种方案,一种是直接使用 application 插件,另一种是 shadowJar 插件。

我最终采用了 shadowJar 的方式实现,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.github.jengelman.gradle.plugins:shadow:1.2.4"
classpath 'gradle.plugin.edu.sc.seis.gradle:launch4j:2.3.0'
}
}

apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

mainClassName = "your.main.ClassName"

shadowJar {
baseName = 'your_jar_name'
}

打包的命令行如下:

1
./gradlew shadowJar

完成后,就可以在 build/libs 目录下找到 *-all.jar

使用 java -jar your-app-all.jar 运行,看下你的程序已经跑起来了。

3. 将 jar 制作成 windows 下的 exe 文件

网上找了很多这方面的工具,最终我发现 launch4j 真是个好用的东西。

我使用的是 launch4j 的 mac 版。这东西是跨平台的。

由于 java 的运行离不开 jre 环境,而除了开发人员,正常用户电脑上基本没有环境。所以我们打包的时候,需要把 jre 一起打包。

mac 上用 launch4j 来将 jar 打包成在 windows 上运行的 exe,还有一点需要注意,就是用于打包的 jre 必须是 windows 下的。

最简单的 launch4j 配置只需两步,就可以把 jar 打包成 exe了。

launch4j 基础配置

launch4j jre 配置

jre 要放置在最终打包的 exe 的同级目录下。这边主要是因为打包后的 exe 是通过相对路径来寻找依赖的 jre。如果配置错误,将导致后面的 exe 文件无法运行。

到这里,最终打包的 exe 是可以运行了。不过 jre 包和 exe 文件是分开的。可以把这些东西,放在一个文件夹下再压缩,最后分发给用户。

还可以把 jre 一起打包到 exe 中。以后有时间我在处理。