java“ $ homeOption” -cp“ $ classPath”“ com.civilizer.extra.tools.DataBroker” -import“ $ importPath”


如果$homeOption不为空,则上面的命令有效,但是$homeOption为空,则找不到主类


错误:找不到或加载主类


看来Empty $homeOption参数以一种不好的方式影响了classpath字符串。对我来说真是奇怪的行为。

任何人遇到这个问题并理解为什么吗?

编辑:

如果可行:

实际的命令行如下:

com.civilizer.extra.tools.DataBroker是带有主要方法的Java类,它包含在该详细类路径中;

在这种情况下,$ 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-导入

如果找不到主类:

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-导入

如前所述,只有$ homeOption为空;但这只是问题所在;顺便说一句,即使$ homeOption为空,该类也可以正常运行,但是您知道,在这种情况下,main方法首先丢失了,这没关系

最佳答案

您可以通过填充数组并将其传递给java命令来解决此问题。

opts=( )
if [[ -n "$homeOption" ]]; then
    opts+=( "$homeOption" )
fi

java "${opts[@]}" -cp "$classPath" "com.civilizer.extra.tools.DataBroker" -import "$importPath"


您看到的问题是因为bash将空白字符串传递给java作为第一个参数,而java将空白字符串作为类:

相比:

$ java foo
Error: Could not find or load main class foo


vs:

$ java ''
Error: Could not find or load main class


您可以看到java打印出在错误中找不到的类名,但是您的情况以及上面的第二种情况,类名是一个空字符串,因此错误消息中的类名也为空。

我的解决方案起作用的原因是,如果数组为空,则bash不会传入任何空参数。并且该数组创建为空,除非$ homeOption具有非空字符串,否则将其保留为空。

08-04 21:04