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 具有非空字符串。