如何在批处理脚本中传递系统变量和普通变量调用Java程序
问题排查解决方法
核心原因
Java命令的执行结构为 java [JVM参数/选项] 主类名 [传递给主类的业务参数]:
- 所有主类名之前的参数(包括
-cp、-D开头的系统属性等)都属于JVM参数,不会传入main方法的args数组 - 只有主类名之后的参数才会进入
args数组,且数组下标从0开始计数
排查步骤
- 确认参数获取方式是否正确
你命令中runConsoltesting之前的-DEPM_ORACLE_INSTANCE=%1、-DHFM_CLUSTER=%2、-DHFM_APPLICATION=%3属于JVM系统属性,无法通过args数组获取,需要调用System.getProperty("参数key")方法取值,示例:String epmInstance = System.getProperty("EPM_ORACLE_INSTANCE"); String hfmCluster = System.getProperty("HFM_CLUSTER"); String hfmApp = System.getProperty("HFM_APPLICATION"); - 统计主类可获取的参数数量
你当前命令里主类runConsoltesting之后只有%4 %5 %6 %7共4个参数,对应args数组的下标为0、1、2、3,最大可访问下标为3,直接访问下标5必然会触发数组越界异常。 - 打印参数验证实际传递结果
在main方法入口处添加日志,确认实际获取到的参数数量和取值:public static void main(String[] args) { // 先打印参数基础信息 System.out.println("args数组长度:" + args.length); for (int i = 0; i < args.length; i++) { System.out.printf("args[%d] = %s%n", i, args[i]); } // 原有业务逻辑 } - 调整参数传递逻辑
如果确实需要将原来的%1、%2、%3作为业务参数传入args数组,直接将三个参数移到主类名之后即可,修改后的命令示例:
修改后java -cp %EPM_JAVA_CLASSPATH% runConsoltesting %1 %2 %3 %4 %5 %6 %7args数组长度为7,可正常访问下标0到6的参数,下标5对应原命令中的%6。
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

