Domanda

Sto cercando di lanciare un'applicazione Java da un C ++ app utilizzando il seguente codice:

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

Quando costruisco ed eseguire il programma ottengo il seguente errore:

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.

Il file testapp.jar è un file JAR eseguibile esportato da un progetto Eclipse con una sola classe in esso:

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

L'EXE e file JAR sono nella stessa identica cartella e sto correndo il file EXE dalla riga di comando. Se si esegue il JAR direttamente mettendo c:\java\jre\bin\java.exe -jar testapp.jar in tutto prompt dei comandi funziona come previsto.

Qualcuno ha idea di cosa sta succedendo qui?

EDIT: Grazie a tutti per il vostro aiuto, ma sembra che ce l'ho ora di lavoro

.
È stato utile?

Soluzione

Risolto esso. Ho usato:

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

considerando che hai utilizzato:

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

, che, quando l'ho usato, replica il vostro errore. La differenza è uno spazio precede l'interruttore -jar e perché che dovrebbe essere, non lo so, mi sono imbattuto su di essa per errore!

Altri suggerimenti

Ho appena dovuto cambiare il modo in cui stavo chiamando 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) {

La documentazione per CreateProcess() specifica per il parametro lpCurrentDirectory:

  

Il percorso completo della directory corrente per il processo. La stringa può anche specificare un percorso UNC.
  Se questo parametro è NULL, il nuovo processo avrà la stessa unità corrente e la directory come il processo chiamante.

È estratto manca una definizione per path, ma molto probabilmente è configurato in modo non corretto.

Prova a specificare la directory del JAR dopo -jar. Si potrebbe avere a che fare con la vostra directory di lavoro corrente ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top