
本文详解 WinSW 在 Windows Nano Server 上使用环境变量(如 %SGW_HOME%)的正确方式,涵盖 <env> 声明、路径展开时机、<arguments> 中变量解析限制及替代方案,并提供可立即验证的配置示例与排错要点。
本文详解 winsw 在 windows nano server 上使用环境变量(如 `%sgw_home%`)的正确方式,涵盖 `
WinSW 默认不会在 <arguments> 或 <executable> 标签中自动展开 Windows 批处理风格的环境变量语法(如 %SGW_HOME%)。这是导致服务启动失败(错误代码 1067:进程意外终止)的根本原因——Java 启动命令被字面量解析为 -jar %SGW_HOME%\lib\mgmt-node-1.0.0.jar,而系统无法识别该路径。
✅ 正确做法是:仅在 <env> 标签中声明环境变量供子进程继承;所有需变量展开的路径必须通过 <workingdirectory> 或 <argument> 的间接方式传递,且推荐使用 <workingdirectory> + 相对路径组合,或改用 <argument> 传入变量值本身。
✅ 推荐配置方案(可靠、跨平台兼容)
<service> <id>SGWJavaService</id> <name>SGWJavaService</name> <description>SGW Java service</description> <!-- ✅ 正确:通过 <env> 将 SGW_HOME 透传给 Java 进程 --> <env name="SGW_HOME" value="%SGW_HOME%"/> <!-- ✅ 关键:设置工作目录为 SGW_HOME,使后续相对路径生效 --> <workingdirectory>%SGW_HOME%</workingdirectory> <!-- ✅ 可靠:使用相对路径,避免变量解析失败 --> <executable>java</executable> <arguments>-jar lib\mgmt-node-1.0.0.jar</arguments> <!-- 可选:指定 JVM 参数或日志路径(同样支持 %VAR% 展开) --> <logpath>%SGW_HOME%\logs</logpath> <logmode>rotate</logmode> </service>
? 原理说明:WinSW 仅在 <workingdirectory>、<logpath>、<env value=""> 等少数标签中支持 %VAR% 语法的启动前展开;而 <arguments> 中的 %SGW_HOME% 完全不解析,会原样传给 Java,导致 FileNotFoundException。
⚠️ 注意事项与排错要点
- Nano Server 兼容性:确保 SGW_HOME 已在系统级环境变量中设置(而非仅当前用户或 CMD 会话),因服务以 LocalSystem 或指定账户运行,不继承交互式会话变量。
- 路径分隔符:Windows 使用反斜杠 \,但 WinSW 内部统一处理为正斜杠 / 更安全(如 lib/mgmt-node-1.0.0.jar)。
-
调试技巧:
- 安装后先不启动,用 sc qc SGWJavaService 检查 BINARY_PATH_NAME 是否含未展开的 %SGW_HOME%;
- 启动失败时查看 WinSW 日志(默认 sgw.log 或 <logpath> 指定位置),搜索 java.io.FileNotFoundException;
- 临时添加 <startmode>Manual</startmode> 并用 WinSW-x64.exe start sgw.xml 手动触发,实时观察控制台输出。
? 替代方案:若必须动态构造 JAR 路径
当 lib/ 不在 SGW_HOME 下时,可借助批处理包装器:
<executable>%SGW_HOME%\bin\launch-sgw.bat</executable> <arguments></arguments>
launch-sgw.bat 内容:
@echo off java -jar "%SGW_HOME%\lib\mgmt-node-1.0.0.jar"
此方式将变量解析交给 CMD,100% 可靠,但增加一层进程开销。
综上,摒弃在 <arguments> 中直接写 %SGW_HOME%,转而利用 <workingdirectory> + 相对路径,是最简洁、健壮且符合 WinSW 设计意图的实践。配置完成后,重新安装并启动即可解决 Error 1067。










