Frage

Ich versuche, eine Java-Anwendung aus einem C ++ starten App mit dem folgenden Code:

#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;
}

Wenn ich bauen und starten Sie das Programm, das ich die folgende Fehlermeldung erhalten:

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.

Die testapp.jar-Datei ist eine ausführbare JAR-Datei von einem Eclipse-Projekt mit einer Klasse in exportierte:

public class Test {
    public static void main(String[] args) {
        System.out.println("test");
    }
}

Die EXE und JAR-Datei sind in den exakt gleichen Ordnern, und ich bin die EXE von der Kommandozeile ausgeführt wird. Wenn ich die JAR direkt ausführen, indem c:\java\jre\bin\java.exe -jar testapp.jar in die Eingabeaufforderung funktioniert alles setzen, wie erwartet.

Hat jemand eine Ahnung, was hier los ist?

EDIT: Vielen Dank für Ihre Hilfe, aber es sieht aus wie ich habe es funktioniert jetzt

.
War es hilfreich?

Lösung

es wird gelöst. Früher habe ich:

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);
    }

Während Sie haben verwendet:

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);
    }

, die, wenn ich es benutzt, repliziert Ihre Fehler. Der Unterschied ist ein Raum, der -jar Schalter vor und warum das so ist, weiß ich nicht, ich stolperte über sie in Fehler!

Andere Tipps

Ich musste nur die Art und Weise ich Create rief:

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) {

Die Dokumentation für CreateProcess() legt fest, für den Parameter lpCurrentDirectory:

  

Der vollständige Pfad zum aktuellen Verzeichnis für den Prozess. Die Zeichenfolge kann auch einen UNC-Pfad angeben.
  Wenn diese Parameter NULL sind, wird der neue Prozess das gleiche aktuelle Laufwerk und Verzeichnis als anruf Prozess hat.

Sie Auszug eine Definition für path fehlt, aber wahrscheinlich ist es falsch eingestellt.

Versuchen Sie das Verzeichnis der JAR nach -jar angeben. Es könnte sich mit Ihrem aktuellen Arbeitsverzeichnis zu tun ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top