一、推荐方案:参数传递法
步骤1:修改BAT脚本
@echo off
java -jar -Dbat.file="%~f0" your-app.jar %*
关键参数说明:
%~f0
:获取BAT文件的完整路径%*
:传递所有原始参数
步骤2:Java代码获取参数
public class BatFileNameGetter {
public static void main(String[] args) {
String batPath = System.getProperty("bat.file");
if (batPath != null) {
File batFile = new File(batPath);
System.out.println("BAT文件名: " + batFile.getName());
System.out.println("完整路径: " + batFile.getAbsolutePath());
} else {
System.out.println("未通过BAT脚本启动");
}
}
}
二、环境变量法
步骤1:修改BAT脚本
@echo off
set LAUNCHER_BAT=%~f0
java -jar your-app.jar %*
步骤2:Java代码读取环境变量
String batPath = System.getenv("LAUNCHER_BAT");
三、特殊场景处理
1. 路径含空格处理
:: 使用US-ASCII转义双引号
java -jar -Dbat.file="%22%~f0%22" your-app.jar
// 使用Apache Commons Lang解码
String decodedPath = StringEscapeUtils.unescapeJava(batPath);
2. 获取相对路径
:: 获取相对于JAR的路径
set RELATIVE_PATH=%~dp0
java -jar -Dbase.dir="%RELATIVE_PATH%" your-app.jar
四、最佳实践建议
- 参数验证:添加路径有效性检查
if (batPath != null) { File f = new File(batPath); if (!f.exists() || !f.getName().endsWith(".bat")) { throw new IllegalArgumentException("无效BAT路径"); } }
- 日志记录:记录完整的启动信息
logger.info("启动器路径:{}", batPath);
- 路径消毒:防止路径注入攻击
String safePath = Paths.get(batPath).normalize().toString();
选择参数传递方案可确保最可靠地获取BAT文件名,建议配合参数校验和日志记录增强健壮性。