基于JavaFX的桌面端网络调试工具
关于此项目
JFX Network Tools 是一款轻便的网络调试工具(基于JavaFX),支持 TCP/UDP 客户端与服务端模式。界面清晰,适用于网络协议调试、IoT 设备测试、教学演示、快速原型开发等场景。这是我第一个开源小工具,有兴趣的小伙伴可以去看看~开源地址在文章末尾
功能亮点
| 功能模块 | 简要说明 |
|---|---|
| TCP/UDP 客户端 & 服务端 | 支持同一工具中切换客户端与服务端,方便调试多种网络模型 |
| 自动应答 | 支持设置静态应答数据,后续计划支持自定义规则应答逻辑 |
| 日志保存 | 可保存通信记录为本地日志,便于回溯与分析 |
| 历史记录 | 自动保存最近的连接配置,一键复用,节省重复输入时间 |
| 定时发送 | 支持周期性发送特定数据,适合模拟心跳包等场景 |
| 主题切换 | 内置浅色/深色主题,并根据操作系统外观自动适配 |
技术栈
使用的技术栈有:
- JavaFX 17+
- Maven
- AtlantaFX
- RichTextFX
- JLink
- Jpackage
打包模块化jar
本项目使用了richtextfx-0.11.5.jar,并且richtextfx-0.11.5.jar依赖了flowless-0.7.4.jar、reactfx-2.0-M5.jar、wellbehavedfx-0.3.3.jar、undofx-2.1.1.jar
这些jar都没有模块化,所以无法使用jlink打包本地镜像,先手动将其及依赖jar进行模块化编译(这将会覆盖原有的 jar),再将已模块化的jar拷贝进项目再add as library或者自制maven仓库在pom.xml引入此maven
前提
下载安装合适的 javafx-sdk
示例
在一个固定的目录(build-modules)下将richtextfx-0.11.5.jar 生成依赖模块
jdeps --ignore-missing-deps --generate-module-info . richtextfx-0.11.5.jar通过以上命令即可生成一个module-info.java的文件在org.fxmisc.richtext目录中。
创建目录:richtextfx-out
编译module-info.java到目录richtextfx-out
# richtextfx-0.11.5.jar有依赖其他jar,
# 所以编译module-info.java时需要将其他已模块化的依赖jar拼接在--module-path
javac \
--module-path "javafx-sdk-17.0.15/lib:flowless-0.7.4.jar:reactfx-2.0-M5.jar:wellbehavedfx-0.3.3.jar:undofx-2.1.1.jar" \
--patch-module org.fxmisc.richtext=richtextfx-0.11.5.jar \
-d richtextfx-out \
org.fxmisc.richtext/module-info.java将已编译的module-info.java打进richtextfx-0.11.5.jar中
jar --update --file=richtextfx-0.11.5.jar -C richtextfx-out module-info.class一键模块化打包
以上示例如何将一个未模块化的jar进行模块化,本项目已将需要模块化的jar统一模块化,并整理成一个脚本,可一键运行模块化。
操作步骤详见本项目 /build-modular/richtextfx 目录,具体包括:
- 解压 JavaFX SDK(根据你的操作系统下载对应的sdk);
- 运行
build.sh脚本自动完成依赖模块化并安装至本地 Maven 仓库; - 即可使用jlink生成可运行镜像。
该过程仅需本地一次性执行,打包后的模块已支持 jlink 运行时构建。
build.sh脚本:
#!/bin/bash
set -e
# === 配置路径 ===
JAVAFX_LIB="javafx-sdk-17.0.15/lib" # 请根据你本地路径修改
REACTFX_JAR="reactfx-2.0-M5.jar"
FLOWLESS_JAR="flowless-0.7.4.jar"
RICHTEXTFX_JAR="richtextfx-0.11.5.jar"
WELLBEHAVEDFX_JAR="wellbehavedfx-0.3.3.jar"
UNDOFX_JAR="undofx-2.1.1.jar"
# === 创建输出目录 ===
mkdir -p reactfx-out flowless-out richtextfx-out wellbehavedfx-out undo-out
# ================ReactFX Start=====================
echo "为 ReactFX 添加 module-info.java"
mkdir -p org.reactfx
cat > org.reactfx/module-info.java <<EOF
module reactfx {
requires javafx.base;
requires javafx.graphics;
requires javafx.controls;
exports org.reactfx;
exports org.reactfx.collection;
exports org.reactfx.inhibeans;
exports org.reactfx.inhibeans.binding;
exports org.reactfx.inhibeans.collection;
exports org.reactfx.inhibeans.property;
exports org.reactfx.inhibeans.value;
exports org.reactfx.value;
exports org.reactfx.util;
}
EOF
echo "[2/13] 编译 ReactFX module-info"
javac \
--module-path "$JAVAFX_LIB" \
--patch-module reactfx="$REACTFX_JAR" \
-d reactfx-out \
org.reactfx/module-info.java
echo "[3/13] 更新 ReactFX JAR"
jar --update --file="$REACTFX_JAR" -C reactfx-out module-info.class
echo "[4/13] 安装 ReactFX 到本地 Maven 仓库"
mvn install:install-file \
-Dfile="$REACTFX_JAR" \
-DgroupId=org.reactfx \
-DartifactId=reactfx \
-Dversion=2.0-M5-modular \
-Dpackaging=jar
# ================ReactFX End=====================
# ================Flowless Start=====================
echo "[5/13] 为 Flowless 添加 module-info.java"
mkdir -p org.fxmisc.flowless
cat > org.fxmisc.flowless/module-info.java <<EOF
module org.fxmisc.flowless {
requires javafx.controls;
requires reactfx;
exports org.fxmisc.flowless;
}
EOF
echo "✅ [6/13] 编译 Flowless module-info"
javac \
--module-path "$JAVAFX_LIB:$REACTFX_JAR" \
--patch-module org.fxmisc.flowless="$FLOWLESS_JAR" \
-d flowless-out \
org.fxmisc.flowless/module-info.java
echo "[7/13] 更新 Flowless JAR"
jar --update --file="$FLOWLESS_JAR" -C flowless-out module-info.class
echo "[8/13] 安装 Flowless 到本地 Maven 仓库"
mvn install:install-file \
-Dfile="$FLOWLESS_JAR" \
-DgroupId=org.fxmisc.flowless \
-DartifactId=flowless \
-Dversion=0.7.4-modular \
-Dpackaging=jar
# ================Flowless End=====================
# ================UndoFX Start=====================
echo "为 UndoFX 添加 module-info.java"
mkdir -p org.fxmisc.undo
cat > org.fxmisc.undo/module-info.java <<EOF
module org.fxmisc.undo {
requires javafx.base;
requires reactfx;
exports org.fxmisc.undo;
}
EOF
echo "编译 UndoFX module-info"
javac \
--module-path "$JAVAFX_LIB:$REACTFX_JAR" \
--patch-module org.fxmisc.undo="$UNDOFX_JAR" \
-d undo-out \
org.fxmisc.undo/module-info.java
echo "更新 UndoFX JAR"
jar --update --file="$UNDOFX_JAR" -C undo-out module-info.class
echo "安装 UndoFX 到本地 Maven 仓库"
mvn install:install-file \
-Dfile="$UNDOFX_JAR" \
-DgroupId=org.fxmisc.undo \
-DartifactId=undofx \
-Dversion=2.1.1-modular \
-Dpackaging=jar
# ================UndoFX End=====================
# ================WellBehavedFX Start=====================
echo "为 WellBehavedFX 添加 module-info.java"
mkdir -p org.fxmisc.wellbehavedfx
cat > org.fxmisc.wellbehavedfx/module-info.java <<EOF
module wellbehavedfx {
requires javafx.controls;
exports org.fxmisc.wellbehaved.event;
exports org.fxmisc.wellbehaved.event.internal;
exports org.fxmisc.wellbehaved.event.template;
}
EOF
echo "编译 WellBehavedFX module-info"
javac \
--module-path "$JAVAFX_LIB" \
--patch-module wellbehavedfx="$WELLBEHAVEDFX_JAR" \
-d wellbehavedfx-out \
org.fxmisc.wellbehavedfx/module-info.java
echo "更新 WellBehavedFX JAR"
jar --update --file="$WELLBEHAVEDFX_JAR" -C wellbehavedfx-out module-info.class
echo "安装 WellBehavedFX 到本地 Maven 仓库"
mvn install:install-file \
-Dfile="$WELLBEHAVEDFX_JAR" \
-DgroupId=org.fxmisc.wellbehavedfx \
-DartifactId=wellbehavedfx \
-Dversion=0.3.3-modular \
-Dpackaging=jar
# ================WellBehavedFX End=====================
# ================RichTextFX Start=====================
echo "为 RichTextFX 添加 module-info.java"
mkdir -p org.fxmisc.richtext
cat > org.fxmisc.richtext/module-info.java <<EOF
module org.fxmisc.richtext {
requires javafx.controls;
requires javafx.fxml;
requires reactfx;
requires org.fxmisc.flowless;
requires org.fxmisc.undo;
requires wellbehavedfx;
exports org.fxmisc.richtext;
exports org.fxmisc.richtext.event;
exports org.fxmisc.richtext.model;
exports org.fxmisc.richtext.util;
}
EOF
echo "[10/13] 编译 RichTextFX module-info"
javac \
--module-path "$JAVAFX_LIB:$REACTFX_JAR:$FLOWLESS_JAR:$WELLBEHAVEDFX_JAR:$UNDOFX_JAR" \
--patch-module org.fxmisc.richtext="$RICHTEXTFX_JAR" \
-d richtextfx-out \
org.fxmisc.richtext/module-info.java
echo "更新 RichTextFX JAR"
jar --update --file="$RICHTEXTFX_JAR" -C richtextfx-out module-info.class
echo "安装 RichTextFX 到本地 Maven 仓库"
mvn install:install-file \
-Dfile="$RICHTEXTFX_JAR" \
-DgroupId=org.fxmisc.richtext \
-DartifactId=richtextfx \
-Dversion=0.11.5-modular \
-Dpackaging=jar
# ================RichTextFX End=====================
echo ""
echo "🎉 所有模块化依赖均已安装完成。"构建流程
Maven直接package,打包本地 .app 可运行文件
jpackage \
--type app-image \
--name "JFX Network Tools" \
--app-version 1.1 \
--input target \
--main-jar jfx-network-tools-1.1.jar \
--main-class cn.nnjskz.jfx.MainApplication \
--runtime-image target/jfx-network-tools-runtime \
--icon target/classes/imgs/network-mac.icns \
--dest /Users/jensen/Downloads软件图片

