惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈 TypeScript事件派发管理器 - OXOXTECH 牛牛技术客栈 MQTT保留消息的使用方法 - OXOXTECH 牛牛技术客栈 世界工程-港珠澳大桥游 - OXOXTECH 牛牛技术客栈 Golang逃逸分析 - OXOXTECH 牛牛技术客栈 设计模式-享元模式 - OXOXTECH 牛牛技术客栈 牛牛成长记录 - OXOXTECH 牛牛技术客栈 ffmpeg常用命令 - OXOXTECH 牛牛技术客栈 设计模式-外观模式 - OXOXTECH 牛牛技术客栈 设计模式-装饰器模式 - OXOXTECH 牛牛技术客栈 设计模式-桥接模式 - OXOXTECH 牛牛技术客栈 5周年恋爱纪念日 - OXOXTECH 牛牛技术客栈 2024新年快乐,龙腾四海 - OXOXTECH 牛牛技术客栈 迎接新年:除夕的美好时刻 - OXOXTECH 牛牛技术客栈 设计模式-适配器模式 - OXOXTECH 牛牛技术客栈 设计模式-原型模式 - OXOXTECH 牛牛技术客栈 设计模式-建造者模式 - OXOXTECH 牛牛技术客栈 设计模式-工厂模式 - OXOXTECH 牛牛技术客栈 设计模式-单例模式 - OXOXTECH 牛牛技术客栈 SpringBoot在Linux环境下发送163邮件失败(No appropriate protocol (protocol is disabled or cipher suites are inappropriate)) 海与日落 - OXOXTECH 牛牛技术客栈 Swagger比较常用的注解 - OXOXTECH 牛牛技术客栈 猫🐱牛 - OXOXTECH 牛牛技术客栈 2023年最后一个晚霞 - OXOXTECH 牛牛技术客栈 Linux(Centos)部署Nginx教程 - OXOXTECH 牛牛技术客栈 Linux MySQL下载安装详细教程(CentOS版) - OXOXTECH 牛牛技术客栈 JavaFx打包成exe - OXOXTECH 牛牛技术客栈 Flux脚本语言入门教程 - OXOXTECH 牛牛技术客栈 演唱会出图 - OXOXTECH 牛牛技术客栈 Netty TCP解决粘包拆包 - OXOXTECH 牛牛技术客栈 SpringBoot实现订单超时取消的几种方案 - OXOXTECH 牛牛技术客栈 详解Java并发中的各种锁 - OXOXTECH 牛牛技术客栈 SpringBoot集成支付宝支付 - OXOXTECH 牛牛技术客栈 雪花算法:分布式系统唯一ID生成算法 - OXOXTECH 牛牛技术客栈 Java解决空指针的神器Optional - OXOXTECH 牛牛技术客栈 与兴一起 - OXOXTECH 牛牛技术客栈 Java17新特性详解与安装 - OXOXTECH 牛牛技术客栈 Jdk17安装+环境配置详细教程 - OXOXTECH 牛牛技术客栈 孤注一掷 - OXOXTECH 牛牛技术客栈 解决WinSCP经常断线重连 - OXOXTECH 牛牛技术客栈 内存不足导致Tomcat崩溃问题排查与解决办法 - OXOXTECH 牛牛技术客栈 influxDB初识,一个高效的时序数据库 - OXOXTECH 牛牛技术客栈 SpringBoot 服务接口限流方案 - OXOXTECH 牛牛技术客栈 Docker 安装 Portainer - OXOXTECH 牛牛技术客栈 Linux 安装Docker - OXOXTECH 牛牛技术客栈 物料宣传 - OXOXTECH 牛牛技术客栈 Java使用EMQX实现MQTT通信 - OXOXTECH 牛牛技术客栈 Java实现常见的排序算法 - OXOXTECH 牛牛技术客栈 FreeSwitch Windows安装教程 - OXOXTECH 牛牛技术客栈 MQTT单向SSL数据加密 - OXOXTECH 牛牛技术客栈 随性 - OXOXTECH 牛牛技术客栈 mysql报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的解决方案 Git Push项目报 push to origin/master was rejected 错误解决方案 游行记——珠海金沙滩与金湖公园之行 - OXOXTECH 牛牛技术客栈 Tomcat:解决Tomcat启动警告:"无法将资源添加到Web应用程序缓存中....请考虑增加缓存空间" 的问题 - OXOXTECH 牛牛技术客栈 励骏庞都广场,迷一般的皇宫 - OXOXTECH 牛牛技术客栈 Docker 常用命令集合 - OXOXTECH 牛牛技术客栈 ElasticSearch Windows版-安装教程 - OXOXTECH 牛牛技术客栈 Java去除对象中为null的字段 - OXOXTECH 牛牛技术客栈 我和我的青春 - OXOXTECH 牛牛技术客栈 Java实现螺旋矩阵算法: - OXOXTECH 牛牛技术客栈 Java直接内存分配和释放的理解 - OXOXTECH 牛牛技术客栈 FreeSwitch将默认数据库迁移至MySQL - OXOXTECH 牛牛技术客栈 别错过路上的风景,别错过刹那间的深情! - OXOXTECH 牛牛技术客栈 Viewer.js:一款强大的图片预览组件 - OXOXTECH 牛牛技术客栈 Java JDK Proxy和CGLib动态代理示例 - OXOXTECH 牛牛技术客栈 redis常用命令 - OXOXTECH 牛牛技术客栈 SpringBoot查询IP归属地 - OXOXTECH 牛牛技术客栈 Spring 事务失效的六种情况 - OXOXTECH 牛牛技术客栈 #张艺兴每时每刻# - OXOXTECH 牛牛技术客栈 Nginx常用命令及具体应用 - OXOXTECH 牛牛技术客栈
基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈
Jensen · 2025-07-21 · via 牛牛技术客栈

Jensen Java Java, 网络, Iot, 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 目录,具体包括:

  1. 解压 JavaFX SDK(根据你的操作系统下载对应的sdk);
  2. 运行 build.sh 脚本自动完成依赖模块化并安装至本地 Maven 仓库;
  3. 即可使用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

软件图片

20250721142105590.webp     20250721142105375.webp    20250721142106938.webp    20250721142107557.webp    20250721142107537.webp


20250721142108521.webp    20250721142109915.webp

开源地址

https://gitee.com/nnjskz/jfx-network-tools

https://github.com/nnjskz/jfx-network-tools