Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将空shell变量传递给Java命令行会导致“错误:无法找到或加载主类”_Java_Bash_Command Line_Classpath - Fatal编程技术网

将空shell变量传递给Java命令行会导致“错误:无法找到或加载主类”

将空shell变量传递给Java命令行会导致“错误:无法找到或加载主类”,java,bash,command-line,classpath,Java,Bash,Command Line,Classpath,java$homeOption-cp$classPath com.civilizer.extra.tools.DataBroker-import$importPath 如果$homeOption不是空的,则上面的命令可以工作,但是$homeOption是空的,则无法找到主类 错误:无法找到或加载主类 看起来空$homeOption参数对类路径字符串的影响不好;这对我来说是如此奇怪的行为 有人遇到这个问题并了解原因吗 编辑: 如果有效: 实际的命令行如下所示 DataBroker是一个带有main

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

如果$homeOption不是空的,则上面的命令可以工作,但是$homeOption是空的,则无法找到主类

错误:无法找到或加载主类

看起来空$homeOption参数对类路径字符串的影响不好;这对我来说是如此奇怪的行为

有人遇到这个问题并了解原因吗

编辑:

如果有效: 实际的命令行如下所示

DataBroker是一个带有main方法的Java类,它包含在详细的类路径中

在本例中,$homeOption是-Dcivilizer.private\u home\u path=/Users/bsw/.civilizer

java-Dcivilizer.private\u home\u 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/target/civilizer-1.0.0.CI-SNAPSHOT/WEB-INF/://Users/bsw/test/trysomething/civilizer/target/lib/://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.0.CI-SNAPSHOT/WEB-INF/lib/:/Users/bsw/test/trysomething/civilizer/target/extra.com.extra.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"
<> P>你看到的问题是因为BASH将一个空字符串传递给java作为第一个参数,java将空字符串作为类:

比较:

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

您可以看到java打印了在错误中找不到的类名,但是您的案例以及上面我的第二个案例中,类名是一个空字符串,因此在错误消息中类名也是空的


我的解决方案工作的原因是,如果数组是空的,那么bash将不会传递任何空参数。数组被创建为空,并保留为空,除非$homeOption有一个非空字符串。

顺便说一句,它是在OS X BashIS DataBroker上测试的,该类使用main方法吗?如果不是,则具有main方法的类的名称是什么。当homeOption不为空时,它设置的值是多少。请分享所有相关信息,以帮助您弄清真相。@CKing抱歉。。。我编辑了问题谢谢,看起来很完美!
$ java ''
Error: Could not find or load main class