Problemas Executar .bat através de um jar

Gostaria de saber se existe uma possibilidade de executar um .bat(o qual executa um outro jar) através de um jar.

O cenário é o seguinte.

Tenho uma aplicação A(Serviço) na qual devera ser chamada através de um outro aplicativo java desktop. Ja tentei as seguinte alternativas porem nenhuma com sucesso.

Tentei chamar de dentro do aplicativo desktop via replection e não obtive sucesso abaixo segue o código:


File jarPath = new File("C:/CaminhoDoMeuJarDeServico/Servico.jar");
					
urls = new URL[]{jarPath.toURL()};

URLClassLoader classLoader = new URLClassLoader(urls,this.getClass().getClassLoader()); 

Object parametrosObjeto[] = {new String[]{}};
Class parametrosClasse[] = {parametrosObjeto[0].getClass()};
Class classe = classLoader.loadClass("br.com.teste.ServiceMain"); 
Object instancia = classe.newInstance(); 

Method metodoMain = classe.getDeclaredMethod("main", parametrosClasse);
metodoMain.invoke(instancia, parametrosObjeto); //executa o metodo

Erro: [b]

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at Main.start2(Main.java:63)
at Main.main(Main.java:19)
Caused by: java.lang.NullPointerException
at br.com.teste.ServiceMain(Unknown Source)
… 6 more

[/b]
Tentei criar um bat no qual ficaria o cargo de chamar a aplicação (Serviço) também não deu segue abaixo os códigos e erros.

try {
	Process p = Runtime.getRuntime().exec("C:/DiretorioDoBat/teste.bat");
	if (p.exitValue() == 0) {
		System.out.println("Programa terminou normalmente");
	}
} catch (Exception e) {
	e.printStackTrace();
}

Erro:

[b]
java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(Native Method)
at Main.start3(Main.java:37)
at Main.main(Main.java:16)

[/b]

outra tentativa de executar o .bat

	try{
	            File f = new File("C:/DiretorioDoBat/teste.bat");
	            ProcessBuilder builder = new ProcessBuilder(new String[] {dir});   
	            Process proc = builder.start();   
	             proc.waitFor();   
	            System.out.println("done");   
	         } catch(IOException e){   
	            e.printStackTrace();   
	         } catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (URISyntaxException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}  

Erro:
Não deu nenhum erro porem não chamou a aplicação

OBS: Se eu colocar dentro do bat apenas “nodepad” ele inicializa o notepad normalmente mas se eu colocar dentro do bat o código "start javaw -jar Service.jar ai não funciona.
Extensão .exe ele consegue executar normalmente o problema é quando tem chamada de java dentro do .bat.

da erro.

Para executar um .bat, você precisa especificar o nome do interpretador de comandos:

cmd.exe /c seuarquivo.bat parametros

como que ficaria isso no meu código?

Tentei da seguinte maneira e nada

Runtime.getRuntime.exec("cmd /c C:/CaminhoDoMeuJarDeServico/teste.bat");  

Não aconteceu nada

Tentei tbm assim

Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+"C:/CaminhoDoMeuJarDeServico/teste.bat");

Só que agora esta dando o erro abaixo:


Exception in thread “main” java.lang.NullPointerException
at br.com.teste.ServiceMain(Unknown Source)

Abaixo segue as tentativa para o .bat

set TESTE_HOME=%~dp0
java -cp "%TEST_HOME%Servico.jar"  -jar "%TESTE_HOME%Servico.jar"
set JAVA_OPTS=-Xms%INITIAL_HEAP_SIZE% -Xmx%MAXIMUM_HEAP_SIZE% -Xss%STACK_SIZE%
set TESTE_HOME=%~dp0
start javaw %JAVA_OPTS% -jar "%TESTE_HOME%Servico.jar" %1 %2 %3

tentei somente com isso

set TESTE_HOME=%~dp0

java -jar "%TESTE_HOME%Servico.jar"

Erro:
Exception in thread “main” java.lang.NullPointerException
at br.com.teste.ServiceMain(Unknown Source)

Sera que o problema esta no .bat agora???

Diferentemente do Java, o cmd.exe não sabe abrir um arquivo com diretórios usando a “/”. Você deve usar a “”. Exemplo:

Runtime.getRuntime.exec("cmd /c \"C:\\CaminhoDoMeuJarDeServico\\este.bat\"");  

Executei como vc falou no post acima e não chamou o .bat.

try {
			
			
			Process p = Runtime.getRuntime().exec("cmd /c \"C:\\CaminhoDoMeuJarDeServico\\teste.bat\"");    
			System.out.println("Antes");
			p.waitFor();
			System.out.println("Depois");
			if (p.exitValue() == 0) {
				System.out.println("Programa terminou normalmente");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

o programa fica travado na linha p.waitFor();

se eu tirar essa linha da uma exception

[b]
Antes
Depois
java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(Native Method)
at Main.start3(Main.java:47)
at Main.main(Main.java:16)

[/b]

Encontrei o que esta acontencendo mas não como arrumar esse problema.

O Problema é o seguinte quando eu chamo o .bat através do código acima o arquivo chama um jar chamado Servico.jar onde ele carrega alguns arquivos de configuração onde se encontram no caminho C:\CaminhoDoMeuJarDeServico\settings mas esta dando NullPointerException por que ele tentando achar essa pasta em meu workspace. Tem como solucionar esse problema? Tem como eu forçar que ele encontre essa pasta dentro do C:\CaminhoDoMeuJarDeServico\settings?

OBS: Se eu der um click duplo no arquivo C:\CaminhoDoMeuJarDeServico\teste.bat ele inicializa normalmente o Servico.jar

Desde já agradeço a força

A forma mais simples é incluir algumas linhas na sua batch alterando o diretório corrente para o desejado.

Exemplo:

setlocal
cd c:\diretorio\desejado\para\a\sua\aplicacao
java -jar teste.jar
endlocal

Obrigado thingol funcionou só foi eu colocar o comando cd c:\diretorio\desejado\para\a\sua\aplicacao que vc falou e funcionou.

Obrigado!!!