Question

Je suis en train de lancer une application Java à partir d'une application C ++ en utilisant le code suivant:

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

Quand je Générez et exécutez le programme que je reçois l'erreur suivante:

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.

Le fichier testapp.jar est un fichier exécutable JAR exporté à partir d'un projet Eclipse avec une seule classe en elle:

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

Le EXE et le fichier JAR sont dans le même dossier exact, et je suis en cours d'exécution EXE à partir de la ligne de commande. Si je lance le JAR directement en mettant c:\java\jre\bin\java.exe -jar testapp.jar dans le tout commande rapide fonctionne comme prévu.

Quelqu'un at-il une idée de ce qui se passe ici?

EDIT: Merci à tous pour votre aide, mais il semble que je l'ai travaille maintenant

.
Était-ce utile?

La solution

résolu. Je:

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

Alors que vous avez utilisé:

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

qui, quand je l'ai utilisé, reproduit votre erreur. La différence est un espace qui précède le commutateur -jar et pourquoi cela devrait être, je ne sais pas, je suis tombé sur elle dans l'erreur!

Autres conseils

Je viens de changer la façon dont j'appelle 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 documentation de CreateProcess() précise pour le paramètre lpCurrentDirectory:

  

Le chemin complet vers le répertoire courant du processus. La chaîne peut également spécifier un chemin UNC.
  Si ce paramètre est NULL, le nouveau processus aura le même lecteur et le répertoire que le processus d'appel.

extrait manque une définition pour path, mais le plus probable qu'il est configuré de manière incorrecte.

Essayez d'indiquer le répertoire du JAR après -jar. Il aurait pu le faire avec votre répertoire de travail courant ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top