我试图启动从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。

没有任何人有什么是怎么回事任何想法?

编辑:谢谢大家的帮助,但它看起来像我有现在的工作

有帮助吗?

解决方案

解决它。我用:

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开关前面的空间,为什么这应该是,我不知道,我在错误偶然发现了它!

其他提示

我不得不改变我打电话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) {

为参数CreateProcess()lpCurrentDirectory指定文件:

  

的完整路径的过程的当前目录。该字符串还可以指定一个UNC路径。结果   如果该参数为NULL,则新进程将具有相同的电流驱动器和目录作为主叫处理。

您摘录缺少path的定义,但它很可能设置不正确。

尝试-jar后指定JAR的目录。这可能与当前工作目录做...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top