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具有非空字符串,否则将其保留为空。