Passing empty shell variable to Java command line causes "Error: Could not find or load main class"
Passing empty shell variable to Java command line causes "Error: Could not find or load main class"
java "$homeOption" -cp "$classPath" "com.civilizer.extra.tools.DataBroker" -import "$importPath"
如果$homeOption
不为空,上面的命令有效,但是$homeOption
为空,找不到主要的class
Error: Could not find or load main class
看起来空 $homeOption
参数对 classpath
字符串有不好的影响;这对我来说太奇怪了;
有人 运行 了解这个问题并了解原因吗?
编辑:
万一有效:
实际命令行如下;
com.civilizer.extra.tools.DataBroker 是一个带有 main 方法的 Java class,它包含在冗长的 classpath;
中
在这种情况下,$homeOption 是 -Dcivilizer.private_home_path=/Users/bsw/.civilizer
java -Dcivilizer.private_home_path=/Users/bsw/.civilizer -cp /Users/bsw/test/ trysomething/civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/classes:/Users/bsw/test/trysomething/civilizer/extra/lib/:/Users/bsw/test/trysomething/ civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/lib/:/Users/bsw/test/trysomething/civilizer/target/extra com.civilizer.extra.tools.DataBroker -import
万一找不到主class:
java -cp /Users/bsw/test/trysomething/civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/classes:/Users/bsw/test /trysomething/civilizer/extra/lib/:/Users/bsw/test/trysomething/civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/lib/:/Users/bsw/test/trysomething/civilizer/target/extra com.civilizer.extra.tools.DataBroker -import
正如我提到的,只有 $homeOption 是空的;但这只是问题所在;顺便说一句,即使 $homeOption 为空,class 也会 运行 没有问题,但是你知道,在这种情况下,首先缺少 main 方法,没关系
您可以通过填充数组并将其传递给 java 命令来解决此问题。
opts=( )
if [[ -n "$homeOption" ]]; then
opts+=( "$homeOption" )
fi
java "${opts[@]}" -cp "$classPath" "com.civilizer.extra.tools.DataBroker" -import "$importPath"
您看到的问题是因为 bash 将空字符串作为第一个参数传递给 java,而 java 将空字符串作为 class:
比较:
$ java foo
Error: Could not find or load main class foo
对比:
$ java ''
Error: Could not find or load main class
你可以看到 java 打印了它在错误中找不到的 class 名称,但是你的情况和我上面的第二个情况,class 名称是一个空字符串,因此 class 名称在错误消息中也是空白。
我的解决方案之所以有效,是因为如果数组为空,则 bash 不会传入任何空参数。并且该数组创建为空,并且留空,除非 $homeOption 具有非空字符串。
java "$homeOption" -cp "$classPath" "com.civilizer.extra.tools.DataBroker" -import "$importPath"
如果$homeOption
不为空,上面的命令有效,但是$homeOption
为空,找不到主要的class
Error: Could not find or load main class
看起来空 $homeOption
参数对 classpath
字符串有不好的影响;这对我来说太奇怪了;
有人 运行 了解这个问题并了解原因吗?
编辑:
万一有效:
实际命令行如下;
com.civilizer.extra.tools.DataBroker 是一个带有 main 方法的 Java class,它包含在冗长的 classpath;
中在这种情况下,$homeOption 是 -Dcivilizer.private_home_path=/Users/bsw/.civilizer
java -Dcivilizer.private_home_path=/Users/bsw/.civilizer -cp /Users/bsw/test/ trysomething/civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/classes:/Users/bsw/test/trysomething/civilizer/extra/lib/:/Users/bsw/test/trysomething/ civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/lib/:/Users/bsw/test/trysomething/civilizer/target/extra com.civilizer.extra.tools.DataBroker -import
万一找不到主class:
java -cp /Users/bsw/test/trysomething/civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/classes:/Users/bsw/test /trysomething/civilizer/extra/lib/:/Users/bsw/test/trysomething/civilizer/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/lib/:/Users/bsw/test/trysomething/civilizer/target/extra com.civilizer.extra.tools.DataBroker -import
正如我提到的,只有 $homeOption 是空的;但这只是问题所在;顺便说一句,即使 $homeOption 为空,class 也会 运行 没有问题,但是你知道,在这种情况下,首先缺少 main 方法,没关系
您可以通过填充数组并将其传递给 java 命令来解决此问题。
opts=( )
if [[ -n "$homeOption" ]]; then
opts+=( "$homeOption" )
fi
java "${opts[@]}" -cp "$classPath" "com.civilizer.extra.tools.DataBroker" -import "$importPath"
您看到的问题是因为 bash 将空字符串作为第一个参数传递给 java,而 java 将空字符串作为 class:
比较:
$ java foo
Error: Could not find or load main class foo
对比:
$ java ''
Error: Could not find or load main class
你可以看到 java 打印了它在错误中找不到的 class 名称,但是你的情况和我上面的第二个情况,class 名称是一个空字符串,因此 class 名称在错误消息中也是空白。
我的解决方案之所以有效,是因为如果数组为空,则 bash 不会传入任何空参数。并且该数组创建为空,并且留空,除非 $homeOption 具有非空字符串。