Skip to content

Commit 17529fe

Browse files
committed
Fix Windows CI and make English the primary README
1 parent f10c7fb commit 17529fe

5 files changed

Lines changed: 170 additions & 164 deletions

File tree

README.en.md

Lines changed: 0 additions & 64 deletions
This file was deleted.

README.md

Lines changed: 28 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -6,122 +6,58 @@
66
<a href="https://github.com/LearnAIHubC/JLaunch/actions/workflows/ci.yml"><img src="https://github.com/LearnAIHubC/JLaunch/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
77
<a href="https://github.com/LearnAIHubC/JLaunch/releases/latest"><img src="https://img.shields.io/github/v/release/LearnAIHubC/JLaunch?display_name=tag&sort=semver&color=4fd1a6" alt="Release"></a>
88
<a href="LICENSE"><img src="https://img.shields.io/github/license/LearnAIHubC/JLaunch?color=6ea8fe" alt="MIT License"></a>
9-
<img src="https://img.shields.io/badge/Electron-43-47848f?logo=electron" alt="Electron 43">
10-
<img src="https://img.shields.io/badge/backend-none-65d1a8" alt="No backend">
119
</p>
1210

13-
<p align="center">
14-
<strong>让 IDE 回归编辑器,让 Java 服务启动、编排和调试交给更轻的桌面工具。</strong>
15-
</p>
11+
<p align="center"><strong>Launch and debug Java services without keeping a full IDE open.</strong></p>
12+
<p align="center">English · <a href="README.zh-CN.md">简体中文</a> · <a href="https://github.com/LearnAIHubC/JLaunch/releases/latest">Latest release</a></p>
1613

17-
<p align="center">
18-
简体中文 · <a href="README.en.md">English</a> · <a href="https://github.com/LearnAIHubC/JLaunch/releases/latest">下载最新版</a>
19-
</p>
14+
JLaunch is a lightweight desktop launchpad for Spring Boot, Maven multi-module projects, and Tomcat. Select a Maven root once and it discovers every runnable Spring Boot application below it. Run and Debug both use the selected JDK's `java` executable directly; Maven is used to resolve an IDEA-like classpath, not as the long-running application process.
2015

21-
JLaunch 是一款面向 Spring Boot、Maven 多模块工程和 Tomcat 的轻量桌面运行器。它会自动识别根目录下所有可运行的 Spring Boot Application,以 `java -classpath ... 主类` 直接启动,并用 JDK 自带的 `jdb` 提供真实断点调试。应用只有 Electron 前端,配置保存在本机 SQLite,不需要独立后端、账号或远程数据库。
16+
JLaunch is an Electron-only desktop application. Settings stay in local SQLite—there is no backend, account, or remote database.
2217

23-
## 核心能力
18+
## Highlights
2419

25-
| 能力 | 说明 |
26-
| --- | --- |
27-
| 自动发现 Application | 选择一个 Maven 根项目,一次识别所有可运行 Spring Boot 工程;普通库模块不会进入运行列表。 |
28-
| 直接 Java 启动 | 普通运行与 Debug 都使用目标 JDK 的 `java`,不会把 `mvn spring-boot:run` 留作常驻进程。 |
29-
| 多项目编排 | 工程按根项目分组,可单独启停,也可在项目组内按照启动顺序依次拉起。 |
30-
| IDEA 风格 classpath | 合并 Maven `runtime + compile` 依赖,将 reactor 模块的 `target/classes` 放在依赖 JAR 前,并兼容 WAR 的 provided 依赖。 |
31-
| 真实断点 Debug | 自动配置 JDWP、连接 JDK 自带 `jdb`,源码树中点击行号即可下断点,请求命中后定位并暂停。 |
32-
| Maven 工具窗 | 浏览完整模块树、选择 Profile、执行 Lifecycle、停止任务并查看独立日志。 |
33-
| 工具链管理 | 自动搜索或手动添加多个 JDK、Maven、Tomcat,每个工程可独立选择版本。 |
34-
| 有界日志 | 项目和 Maven 控制台只保留最近 2,000 行,支持文本、正则、大小写逐行筛选。 |
20+
- Discover runnable Spring Boot applications while excluding library-only modules.
21+
- Launch with `java -classpath ... MainClass`, `java -jar`, or managed Tomcat.
22+
- Merge Maven runtime and compile scopes, including provided dependencies needed by WAR/JSP projects.
23+
- Group applications by repository and start a repository in configured order.
24+
- Attach the selected JDK's `jdb`, browse source as a directory tree, set line breakpoints, pause, and resume.
25+
- Manage multiple JDK, Maven, and Tomcat installations globally or per project.
26+
- Use a Maven tool window with module tree, Profiles, Lifecycle goals, cancellation, and logs.
27+
- Keep memory bounded to the newest 2,000 lines per console, with text and regular-expression filters.
3528

36-
## 下载
29+
## Downloads
3730

38-
前往 [Releases](https://github.com/LearnAIHubC/JLaunch/releases/latest) 下载与你的平台匹配的文件:
31+
Download the latest build from [GitHub Releases](https://github.com/LearnAIHubC/JLaunch/releases/latest).
3932

40-
| 平台 | 文件 | 架构 |
33+
| Platform | Packages | Architectures |
4134
| --- | --- | --- |
42-
| macOS | `.dmg` / `.zip` | Apple Silicon、Intel |
43-
| Windows | Setup `.exe` / Portable `.exe` | x64 |
44-
45-
> 当前公开构建未进行 Apple Developer ID 或 Windows Authenticode 签名。macOS 首次启动请在 Finder 中右键选择“打开”;Windows 可能显示 SmartScreen 提示。源码和 SHA-256 校验文件会与安装包同时发布。
46-
47-
## 快速开始
48-
49-
### 1. 配置工具链
50-
51-
打开右上角“工具链”。JLaunch 会扫描 `JAVA_HOME``MAVEN_HOME``M2_HOME``CATALINA_HOME`、当前 `PATH`,以及 macOS、Windows、Linux、Homebrew、SDKMAN 等常见安装目录。未被发现的版本可手动选择安装根目录。
52-
53-
### 2. 添加 Maven 根项目
54-
55-
点击左侧 `+`,选择包含根 `pom.xml` 的目录。JLaunch 会遍历模块,只导入同时满足以下条件的工程:
56-
57-
- 存在 Spring Boot Maven 插件;
58-
- 源码包含 `@SpringBootApplication`
59-
- 主类调用 `SpringApplication.run(...)`
60-
61-
工程名称、主类、模块目录会自动填写。`$MODULE_WORKING_DIR$` 会在运行时解析成每个 Application 自己的 Maven 模块目录。
62-
63-
### 3. 编译并运行
35+
| macOS | DMG, ZIP | Apple Silicon, Intel |
36+
| Windows | NSIS installer, portable EXE | x64 |
6437

65-
直接 Java 启动要求模块已有 `target/classes`。首次运行前,可在 Maven 工具窗执行 `compile`。随后点击工程右侧“运行”或“Debug”。
38+
Public builds are currently unsigned. macOS may require **Right click → Open**, and Windows may show a SmartScreen warning. Every release includes SHA-256 checksums.
6639

67-
```text
68-
普通运行 JDK/bin/java -classpath <reactor classes + Maven dependencies> <MainClass>
69-
Debug JDK/bin/java -agentlib:jdwp=... -classpath ... <MainClass>
70-
Tomcat catalina run / catalina jpda run
71-
```
72-
73-
## Debug 工作流
74-
75-
1. 为工程选择独立 Debug 端口;
76-
2. 点击“Debug”,JLaunch 启动 Java 并自动连接 `jdb`
77-
3. 在源码树打开 Java 文件,点击行号设置断点;
78-
4. 请求命中断点后,线程暂停并自动定位到对应源码行;
79-
5. 点击“继续”恢复执行。
80-
81-
当前调试闭环聚焦断点与继续运行,不提供变量求值和单步执行。Debug 端口只监听回环地址。
82-
83-
## 架构与安全边界
84-
85-
```mermaid
86-
flowchart LR
87-
UI["Renderer UI"] -->|"白名单 IPC"| PRELOAD["Sandboxed preload"]
88-
PRELOAD --> MAIN["Electron main"]
89-
MAIN --> DB[("Local SQLite")]
90-
MAIN --> PROC["Process manager"]
91-
PROC --> JAVA["JDK / jdb"]
92-
PROC --> MVN["Maven"]
93-
PROC --> TC["Tomcat"]
94-
```
40+
## Quick start
9541

96-
- Renderer 禁用 Node 集成,开启 `contextIsolation`、sandbox 与 CSP;DevTools 和远程调试入口默认关闭。
97-
- 源码读取验证真实路径,拒绝目录穿越和项目外符号链接。
98-
- SQLite 使用 WAL 与事务;没有 HTTP 服务,不上传项目源码或运行日志。
99-
- 环境变量以明文保存在本机 SQLite,请勿存放不应落盘的长期密钥。
100-
- 应用退出时先优雅停止托管进程,超时后清理完整进程树。
42+
1. Open **Toolchains** and let JLaunch discover JDK, Maven, and Tomcat installations.
43+
2. Add a directory containing a root `pom.xml`.
44+
3. Run Maven `compile` once if the modules do not have `target/classes` yet.
45+
4. Select an application and choose **Run** or **Debug**.
10146

102-
更多细节见 [架构说明](docs/ARCHITECTURE.md)[安全策略](SECURITY.md)
47+
`$MODULE_WORKING_DIR$` resolves to each discovered application's own Maven module directory.
10348

104-
## 本地开发
49+
## Development
10550

106-
要求 Node.js 22+ npm 10+
51+
Requirements: Node.js 22+ and npm 10+.
10752

10853
```bash
10954
npm ci
11055
npm start
11156
npm run check
112-
```
113-
114-
生成当前平台安装包:
115-
116-
```bash
11757
npm run dist
11858
```
11959

120-
输出目录为 `release/`。Windows、macOS 安装包应在对应系统或 GitHub Actions runner 上构建。
121-
122-
## 参与贡献
123-
124-
欢迎提交 Bug、功能建议和 Pull Request。开始前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。版本变化见 [CHANGELOG.md](CHANGELOG.md)
60+
See [Architecture](docs/ARCHITECTURE.md), [Contributing](CONTRIBUTING.md), and [Security](SECURITY.md) for more detail.
12561

12662
## License
12763

README.zh-CN.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<p align="center">
2+
<img src="docs/assets/hero.svg" alt="JLaunch — Java Launch Control" width="100%">
3+
</p>
4+
5+
<p align="center">
6+
<a href="https://github.com/LearnAIHubC/JLaunch/actions/workflows/ci.yml"><img src="https://github.com/LearnAIHubC/JLaunch/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
7+
<a href="https://github.com/LearnAIHubC/JLaunch/releases/latest"><img src="https://img.shields.io/github/v/release/LearnAIHubC/JLaunch?display_name=tag&sort=semver&color=4fd1a6" alt="Release"></a>
8+
<a href="LICENSE"><img src="https://img.shields.io/github/license/LearnAIHubC/JLaunch?color=6ea8fe" alt="MIT License"></a>
9+
<img src="https://img.shields.io/badge/Electron-43-47848f?logo=electron" alt="Electron 43">
10+
<img src="https://img.shields.io/badge/backend-none-65d1a8" alt="No backend">
11+
</p>
12+
13+
<p align="center">
14+
<strong>让 IDE 回归编辑器,让 Java 服务启动、编排和调试交给更轻的桌面工具。</strong>
15+
</p>
16+
17+
<p align="center">
18+
<a href="README.md">English</a> · 简体中文 · <a href="https://github.com/LearnAIHubC/JLaunch/releases/latest">下载最新版</a>
19+
</p>
20+
21+
JLaunch 是一款面向 Spring Boot、Maven 多模块工程和 Tomcat 的轻量桌面运行器。它会自动识别根目录下所有可运行的 Spring Boot Application,以 `java -classpath ... 主类` 直接启动,并用 JDK 自带的 `jdb` 提供真实断点调试。应用只有 Electron 前端,配置保存在本机 SQLite,不需要独立后端、账号或远程数据库。
22+
23+
## 核心能力
24+
25+
| 能力 | 说明 |
26+
| --- | --- |
27+
| 自动发现 Application | 选择一个 Maven 根项目,一次识别所有可运行 Spring Boot 工程;普通库模块不会进入运行列表。 |
28+
| 直接 Java 启动 | 普通运行与 Debug 都使用目标 JDK 的 `java`,不会把 `mvn spring-boot:run` 留作常驻进程。 |
29+
| 多项目编排 | 工程按根项目分组,可单独启停,也可在项目组内按照启动顺序依次拉起。 |
30+
| IDEA 风格 classpath | 合并 Maven `runtime + compile` 依赖,将 reactor 模块的 `target/classes` 放在依赖 JAR 前,并兼容 WAR 的 provided 依赖。 |
31+
| 真实断点 Debug | 自动配置 JDWP、连接 JDK 自带 `jdb`,源码树中点击行号即可下断点,请求命中后定位并暂停。 |
32+
| Maven 工具窗 | 浏览完整模块树、选择 Profile、执行 Lifecycle、停止任务并查看独立日志。 |
33+
| 工具链管理 | 自动搜索或手动添加多个 JDK、Maven、Tomcat,每个工程可独立选择版本。 |
34+
| 有界日志 | 项目和 Maven 控制台只保留最近 2,000 行,支持文本、正则、大小写逐行筛选。 |
35+
36+
## 下载
37+
38+
前往 [Releases](https://github.com/LearnAIHubC/JLaunch/releases/latest) 下载与你的平台匹配的文件:
39+
40+
| 平台 | 文件 | 架构 |
41+
| --- | --- | --- |
42+
| macOS | `.dmg` / `.zip` | Apple Silicon、Intel |
43+
| Windows | Setup `.exe` / Portable `.exe` | x64 |
44+
45+
> 当前公开构建未进行 Apple Developer ID 或 Windows Authenticode 签名。macOS 首次启动请在 Finder 中右键选择“打开”;Windows 可能显示 SmartScreen 提示。源码和 SHA-256 校验文件会与安装包同时发布。
46+
47+
## 快速开始
48+
49+
### 1. 配置工具链
50+
51+
打开右上角“工具链”。JLaunch 会扫描 `JAVA_HOME``MAVEN_HOME``M2_HOME``CATALINA_HOME`、当前 `PATH`,以及 macOS、Windows、Linux、Homebrew、SDKMAN 等常见安装目录。未被发现的版本可手动选择安装根目录。
52+
53+
### 2. 添加 Maven 根项目
54+
55+
点击左侧 `+`,选择包含根 `pom.xml` 的目录。JLaunch 会遍历模块,只导入同时满足以下条件的工程:
56+
57+
- 存在 Spring Boot Maven 插件;
58+
- 源码包含 `@SpringBootApplication`
59+
- 主类调用 `SpringApplication.run(...)`
60+
61+
工程名称、主类、模块目录会自动填写。`$MODULE_WORKING_DIR$` 会在运行时解析成每个 Application 自己的 Maven 模块目录。
62+
63+
### 3. 编译并运行
64+
65+
直接 Java 启动要求模块已有 `target/classes`。首次运行前,可在 Maven 工具窗执行 `compile`。随后点击工程右侧“运行”或“Debug”。
66+
67+
```text
68+
普通运行 JDK/bin/java -classpath <reactor classes + Maven dependencies> <MainClass>
69+
Debug JDK/bin/java -agentlib:jdwp=... -classpath ... <MainClass>
70+
Tomcat catalina run / catalina jpda run
71+
```
72+
73+
## Debug 工作流
74+
75+
1. 为工程选择独立 Debug 端口;
76+
2. 点击“Debug”,JLaunch 启动 Java 并自动连接 `jdb`
77+
3. 在源码树打开 Java 文件,点击行号设置断点;
78+
4. 请求命中断点后,线程暂停并自动定位到对应源码行;
79+
5. 点击“继续”恢复执行。
80+
81+
当前调试闭环聚焦断点与继续运行,不提供变量求值和单步执行。Debug 端口只监听回环地址。
82+
83+
## 架构与安全边界
84+
85+
```mermaid
86+
flowchart LR
87+
UI["Renderer UI"] -->|"白名单 IPC"| PRELOAD["Sandboxed preload"]
88+
PRELOAD --> MAIN["Electron main"]
89+
MAIN --> DB[("Local SQLite")]
90+
MAIN --> PROC["Process manager"]
91+
PROC --> JAVA["JDK / jdb"]
92+
PROC --> MVN["Maven"]
93+
PROC --> TC["Tomcat"]
94+
```
95+
96+
- Renderer 禁用 Node 集成,开启 `contextIsolation`、sandbox 与 CSP;DevTools 和远程调试入口默认关闭。
97+
- 源码读取验证真实路径,拒绝目录穿越和项目外符号链接。
98+
- SQLite 使用 WAL 与事务;没有 HTTP 服务,不上传项目源码或运行日志。
99+
- 环境变量以明文保存在本机 SQLite,请勿存放不应落盘的长期密钥。
100+
- 应用退出时先优雅停止托管进程,超时后清理完整进程树。
101+
102+
更多细节见 [架构说明](docs/ARCHITECTURE.md)[安全策略](SECURITY.md)
103+
104+
## 本地开发
105+
106+
要求 Node.js 22+ 与 npm 10+。
107+
108+
```bash
109+
npm ci
110+
npm start
111+
npm run check
112+
```
113+
114+
生成当前平台安装包:
115+
116+
```bash
117+
npm run dist
118+
```
119+
120+
输出目录为 `release/`。Windows、macOS 安装包应在对应系统或 GitHub Actions runner 上构建。
121+
122+
## 参与贡献
123+
124+
欢迎提交 Bug、功能建议和 Pull Request。开始前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。版本变化见 [CHANGELOG.md](CHANGELOG.md)
125+
126+
## License
127+
128+
[MIT](LICENSE) © 2026 JLaunch contributors

tests/classpath-resolver.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ test('builds an IDEA-style classpath with reactor classes before Maven dependenc
6565

6666
const prepared = await resolver.prepare(project);
6767
assert.deepEqual(prepared.runtimeClasspath, [
68-
path.join(fs.realpathSync(application), 'target', 'classes'),
69-
path.join(fs.realpathSync(core), 'target', 'classes'),
68+
path.join(await fs.promises.realpath(application), 'target', 'classes'),
69+
path.join(await fs.promises.realpath(core), 'target', 'classes'),
7070
dependencyOne,
7171
dependencyTwo,
7272
providedDependency

0 commit comments

Comments
 (0)