我正在尝试使用以下代码从C ++应用程序启动Java应用程序:
#include <windows.h>
#include <memory.h>
#include <tchar.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
if (CreateProcess(TEXT("c:\\java\\jre\\bin\\java.exe"), TEXT("-jar testapp.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
return 0;
}
当我构建并运行程序时,我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: testapp/jar
Caused by: java.lang.ClassNotFoundException: testapp.jar
at: java.net.URLClassLoader$1.run(Uknown Source)
at: java.security.AccessController.doPrivileged(Native Method)
at: java.net.URLClassLoader.findClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
at: sun.misc.Launcher$AppClassLoader.loadClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
Could not find the main class: testapp.jar. Program will exit.
testapp.jar
文件是从Eclipse项目导出的可运行的JAR文件,其中包含一个类:
public class Test {
public static void main(String[] args) {
System.out.println("test");
}
}
EXE和JAR文件位于完全相同的文件夹中,我正在从命令行运行EXE。如果我通过将c:\java\jre\bin\java.exe -jar testapp.jar
放入命令提示符直接运行JAR,一切都按预期工作。
有谁知道这里发生了什么?
编辑:谢谢大家的帮助,但看起来我现在已经开始工作了。答案 0 :(得分:8)
解决了它。我用过:
if (CreateProcess(TEXT("C:\\Program Files\\Java\\jre6\\bin\\java.exe"), TEXT(" -jar test.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
你曾经使用过:
if (CreateProcess(TEXT("C:\\Program Files\\Java\\jre6\\bin\\java.exe"), TEXT("-jar test.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
当我使用它时,会复制你的错误。区别在于-jar
开关之前的空间以及为什么应该这样,我不知道,我错误地偶然发现了它!
答案 1 :(得分:3)
我只需改变调用CreateProcess的方式:
wchar_t *command = (wchar_t*)calloc(512, sizeof(wchar_t));
wsprintf(command, TEXT("c:\\java\\jre\\bin\\java.exe -jar testapp.jar"));
if (CreateProcess(NULL, command, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
答案 2 :(得分:1)
CreateProcess()
的文档指定参数lpCurrentDirectory
:
进程当前目录的完整路径。该字符串还可以指定UNC路径 如果此参数为NULL,则新进程将具有与调用进程相同的当前驱动器和目录。
您的摘录缺少path
的定义,但很可能是设置不正确。
答案 3 :(得分:0)
尝试在-jar
之后指定JAR的目录。它可能与您当前的工作目录有关...