|
|
@@ -13,7 +13,7 @@ java -cp "target/classes:$(mvn -q dependency:build-classpath -Dmdep.outputFile=/
|
|
|
|
|
|
各示例声明了 `static Logger`(slf4j),手工执行时 classpath 必须带上 logback/slf4j 依赖,
|
|
|
否则报 `NoClassDefFoundError: org/slf4j/LoggerFactory`。
|
|
|
-示例的行为由 JUnit 5 测试守护:`mvn test` 直接驱动夹具子进程做端到端校验。
|
|
|
+示例的行为由 JUnit 5 测试守护:`mvn test` 直接驱动子进程程序做端到端校验。
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -35,6 +35,8 @@ java -cp "target/classes:$(mvn -q dependency:build-classpath -Dmdep.outputFile=/
|
|
|
|
|
|
> 子进程程序固定放在 `src/main/resources/code/<主题>/Main.java`,示例先编译再运行,
|
|
|
> 公共类 `Jdk`(`javac()`/`java()` 绝对路径、`compileFixture()`)负责这两件事。
|
|
|
+> 这类预先写好的、供示例与测试反复使用的子进程程序,英文习惯称 fixture(测试夹具),
|
|
|
+> 本教程统一使用"子进程程序"这一叫法。
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -468,7 +470,7 @@ destroy() 已发起: true
|
|
|
## 常见踩坑小结
|
|
|
|
|
|
1. 编译/运行子进程的 `javac`、`java` 用 `java.home` 的**绝对路径**,不要裸写命令名。
|
|
|
-2. `user.dir` 相对的工作目录要跟 `src/main/resources/code/` 下的夹具目录保持一致,否则 `error=2`。
|
|
|
+2. `user.dir` 相对的工作目录要跟 `src/main/resources/code/` 下的子进程程序目录保持一致,否则 `error=2`。
|
|
|
3. 同步 `lines().forEach(...)` 读子进程输出会阻塞到子进程退出,限时 `waitFor` 前要在后台线程读取。
|
|
|
4. `waitFor(timeout, unit)` 返回 boolean;超时后取退出码要 `destroy() + waitFor()` 再 `exitValue()`。
|
|
|
5. `ProcessBuilder` 不经 shell:参数数组每一项就是一个参数,引号/`$VAR`/通配符/`|` 都不生效,需要时用 `sh -c "..."`。
|