我正在尝试以编程方式从C ++在命令行上启动java应用程序。一切正常,直到我尝试使用“Xbootclasspath / p:”开关将一些jar添加到目标应用程序类路径。当我这样做时,Java VM无法启动并生成java.lang.NoClassDefFoundError。
奇怪的是,当我从C ++程序打印出-Xbootclasspath字符串(使用cout<<)然后手动将其复制并粘贴到命令行时,一切都按预期运行。我只是想知道C ++“system”命令是否在执行它之前以某种方式隐式修改字符串?这是我用来启动Java应用程序的简单C ++代码:
string generateBootClassPath(){
string bootClassPath = "-Xbootclasspath/p:" + getHomePath() + "\\HyperSpaceClient\\Boot\\BootCompanion.jar;Scale_HyperSpaceClient_DUI\\dist\\Scale_HyperSpaceClient_DUI.jar ";
return bootClassPath;
}
注意:上面的“getHomePath”函数只返回当前用户的主目录
用作始终存储目标“BootCompanion.jar”的前缀。
然后主要功能..
在这里我简单地连接java应用程序加载(作为参数传入
主要方法)我在上面生成的bootclasspath字符串。然后我调用标准C ++系统()
函数将字符串传递给命令行并执行它。
int main(int argc, char* argv[])
{
string fullStartUpString = java + generateBootClassPath() + argv[1];
system(fullStartUpString.c_str());
}
所有非常标准的东西,不知道为什么它没有按预期工作。
答案 0 :(得分:0)
经过几个小时的测试和调试后,我设法解决了我之前发布的代码示例中的问题;我以为我会在这里分享一些细节,希望如果他们在某些时候遇到这个问题,可能会节省相当多的时间和精力:
发布代码的主要问题是双引号字符(即“)”,在整个发布的代码示例中广泛使用,实际上被C ++编译器认为是一个特殊字符,因此应该在少数情况下,当用作String Literal值的一部分时,将被ESCAPED最终传递给“system()”命令。
澄清:系统(“你好世界!”);应该写成:system(“\”Hello World \“”);
注意每个双引号字符前面的“\”转义字符。一旦我对代码示例的相关部分进行了这种更改,它就按预期工作了。