Pergunta

Estou tentando lançar um aplicativo Java a partir de um aplicativo C ++ usando o seguinte código:

#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 eu construo e executo o programa, recebo o seguinte erro:

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.

o testapp.jar O arquivo é um arquivo JAR executável exportado de um projeto Eclipse com uma única classe:

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

O arquivo EXE e JAR estão exatamente na mesma pasta e estou executando o EXE na linha de comando. Se eu correr o frasco diretamente colocando c:\java\jre\bin\java.exe -jar testapp.jar no comando-promove tudo, tudo funciona conforme o esperado.

Alguém tem alguma ideia do que está acontecendo aqui?

EDIT: Obrigado a todos pela sua ajuda, mas parece que tenho que funcionar agora.

Foi útil?

Solução

Resolvi-o. Eu usei:

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 que você usou:

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

que, quando eu o usei, replica seu erro. A diferença é um espaço que precede o -jar Mudar e por que isso deveria ser, eu não sei, tropecei nele por erro!

Outras dicas

Eu só tive que mudar a maneira como eu estava chamando de criação de criação:

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

A documentação para CreateProcess() Especifica para o parâmetro lpCurrentDirectory:

O caminho completo para o diretório atual para o processo. A string também pode especificar um caminho UNC.
Se esse parâmetro for nulo, o novo processo terá a mesma unidade e diretório atuais que o processo de chamada.

Seu trecho está faltando uma definição para path, mas provavelmente está configurado incorretamente.

Tente especificar o diretório do frasco depois -jar. Pode ter a ver com seu diretório de trabalho atual ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top