从C ++调用-Xbootclasspath / p :.

时间:2013-12-03 14:32:17

标签: java c++

我正在尝试以编程方式从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());

}

所有非常标准的东西,不知道为什么它没有按预期工作。

1 个答案:

答案 0 :(得分:0)

经过几个小时的测试和调试后,我设法解决了我之前发布的代码示例中的问题;我以为我会在这里分享一些细节,希望如果他们在某些时候遇到这个问题,可能会节省相当多的时间和精力:

发布代码的主要问题是双引号字符(即“)”,在整个发布的代码示例中广泛使用,实际上被C ++编译器认为是一个特殊字符,因此应该在少数情况下,当用作String Literal值的一部分时,将被ESCAPED最终传递给“system()”命令。

澄清:系统(“你好世界!”);应该写成:system(“\”Hello World \“”);

注意每个双引号字符前面的“\”转义字符。一旦我对代码示例的相关部分进行了这种更改,它就按预期工作了。