Criação de Serviço a partir de arquivo executável JAVA .JAR ( 32bits e 64Bits )

Estou publicando este post em parte para externar a minha alegria em desenvolver a minha primeira aplicação “útil” em JAVA.

Entenda aplicação “util” como algo que de fato será utilizado por uma empresa em seu cotidiano.

Vamos lá! O que esperar deste post:

1. Ao final teremos um serviço rodando em ambiente windows e executando o conteúdo de um arquivo executável JAVA (.JAR);

2. Estarei disponibilizando um exemplo de classe java utilizando Thread que pode ser encontrado nas páginas 791 e 793 do livro Java Como Programar do Deitel para ser utilizado no serviço.

3. Estará descrito também o que será necessário em termos de download na Internet para que todo o projeto funcione.

Começa aqui o tutorial.

1. Crie um projeto Java com o nome de Threading;

2. Crie um classe Java que será chamada de PrintTask conforme pode ser visto no código abaixo:

package br.com.andersonoliveirasilva.thread;
import java.util.Random;public class PrintTask implements Runnable{
 private int sleepTime = 0;
 private String threadName = "";
 private static Random generator = new Random();
public PrintTask(String name){
 threadName = name;
 sleepTime = generator.nextInt(10000);
 }
@Override
 public void run() {
 // TODO Auto-generated method stub
 try{
 System.out.printf("%s going to sleep for %d milliseconds.\n",
 threadName, sleepTime);
 Thread.sleep(sleepTime);
 }
 catch(InterruptedException exception){
 exception.printStackTrace();
 }
 System.out.printf("%s done sleeping\n", threadName);
 }
 }

3. Crie um outra classe Java para utilizar a implementação de Runnable e que também será a principal classe do projeto.

package br.com.andersonoliveirasilva.thread;
import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
public class RunnableTester {
public static void main(String[] args) {
 PrintTask task1 = new PrintTask("thread1");
 PrintTask task2 = new PrintTask("thread2");
 PrintTask task3 = new PrintTask("thread3");
System.out.println("Starting threads");
ExecutorService threadExecutor = Executors.newFixedThreadPool(3);
threadExecutor.execute(task1);
 threadExecutor.execute(task2);
 threadExecutor.execute(task3);
threadExecutor.shutdown();
System.out.println("Threads started, main ends\n");
 }
 }

4. Execute o seu projeto Java no intuito de validar se todo o código está funcionando corretamente.

Tela 1 Post Serviço Windows com Java
Tela 1 Post Serviço Windows com Java

.

.

.

.

.

.

.

5. Caso o projeto rodando corretamente, vamos preparar o ambiente para o serviço criando a pasta services no c: ( c:\services);

6. Vamos Exportar o projeto JAVA para a pasta services. Selecione o projeto, clique com o botão direito e na opção EXPORT.

tela2

.

.

.

.

.

.

7. – Selecione a opção Runnable JAR file e clique em NEXT

tela3

.

.

.

.

.

.

.

.

.

8.  Nesta fase do assistente será necessário informar a classe de iniciação do projeto, o local onde o arquivo .JAR será exportado, realize a configuração necessário e clique em FINISH.

IMPORTANTE: Marque a opção “Package required libraries into generated JAR” para garantir que todas as dependências estarão no arquivo JAR.
Caso seja um projeto muito grande, pode utilizar última opção e o eclipse irá gerar uma pasta com todas as dependências necessárias.

tela4

.

.

.

.

.

.

.

.

.

.

– Para testar se a exportação deu certo, acesse via prompt de comando e digite os comandos como na figura abaixo.
– Estando na pasta c:\services, digite java -jar task.jar

tela5

.

.

.

.

.

Começando a instalação do serviço
9.  Acesse o endereço ( http://www.apache.org/dist/commons/daemon/binaries/windows/) e realize o download do arquivo ( commons-daemon-1.0.13-bin-windows.zip )

10. Acesse o endereço ( http://commons.apache.org/proper/commons-daemon//procrun.html ) onde será possível obter detalhes sobre a implantação demostrada a seguir.

11. Descompacte o arquivo commons-daemon-1.0.13-bin-windows.zip na pasta c:\service

tela6

.

.

.

.

.

.

12.  Copie o arquivo prunsrv.exe para a pasta c:\windows\system32 de acordo com a arquitetura do sistema operacional, se for 64bits copie da pasta c:\services\amd64\prunsrv.exe

Vamos a partir de agora criar dois arquivos de lote ( Install.bat e Uninstall.bat )
13. Salve um arquivo com o nome de Install.bat na pasta c:\services com o texto abaixo:

set SERVICE_NAME=RunnableTester
 set PR_INSTALL=C:\services\amd64\prunsrv.exe
REM Service log configuration
 set PR_LOGPREFIX=%SERVICE_NAME%
 set PR_LOGPATH=C:\services\logs
 set PR_STDOUTPUT=C:\services\logs\stdout.txt
 set PR_STDERROR=C:\services\logs\stderr.txt
 set PR_LOGLEVEL=Error
REM Path to java installation
 set PR_JVM=C:\Program Files\Java\jre7\bin\server\jvm.dll
 set PR_CLASSPATH=c:\services\task.jar
REM Startup configuration
 set PR_STARTUP=auto
 set PR_STARTMODE=jvm
 set PR_STARTCLASS=br.com.andersonoliveirasilva.thread.RunnableTester
 set PR_STARTMETHOD=main
REM Shutdown configuration
 set PR_STOPMODE=jvm
 set PR_STOPCLASS=br.com.andersonoliveirasilva.thread.RunnableTester
 set PR_STOPMETHOD=main
REM JVM configuration
 set PR_JVMMS=256
 set PR_JVMMX=1024
 set PR_JVMSS=4000
 set PR_JVMOPTIONS=-Duser.language=DE;-Duser.region=de
REM Install service
 prunsrv.exe //IS//%SERVICE_NAME% --DisplayName="Test for create service" --Description="Description of the test service"
prunsrv.exe //RS//%SERVICE_NAME%
 pause

14. Após salvar o arquivo, execute o mesmo com privilégios de administrador.

15. Verifique na lista de serviços do windows ( services.msc ) para certificar que o serviço realmente foi criado no windows.

tela7

.

.

.

.

.

.

.

16. Clique no botão Iniciar da tela do serviço para garantir que tudo está funcionando.

A característica do projeto deste exemplo o serviço irá funcionar por no máximo 10 segundos e encerrará.

————————————————————————————————————————————————————–

Finalizo aqui o procedimento para criação do serviço no windows, nas sessões seguintes irei demonstrar o arquivo para desinstalação do serviço e também os possíveis erros que podem ocorrer durantes este procedimento.

———————————————————————————————————————-

Aquivos para desinstalação

O arquivo de lote para desinstalação do serviço no windows deverá conter o texto, salve na pasta c:\services com o nome de Uninstall.bat:

prunsrv //DS//RunnableTester
pause

Possíveis erros

Possível ERRO 1 : Arquivo prunsrv.exe deve estar na pasta de sistemas

tela8

Este fato se dá pelo simples motivo do arquivo não estar em uma pasta reconhecida pelo sistema como detentora de arquivos executáveis, note que o windows está tentando executar o arquivo a partir do c:\windows\system32 e não da pasta c:\service.

Por este motivo iremos copiar o arquivo da endereço C:\services\prunsrv.exe para a pasta c:\windows\system32

.

.

Possível ERRO 2: O arquivo prunsrv.exe que deverá ser adicionado em system32 deverá ser de acordo com a arquitetura a ser utilizada ( 32 ou 64bits).

tela9

Se este erro ocorrer provavelmente você colocou em system32 e no arquivo de lote para instalação uma referência ao prunsrv.exe de uma arquitetura diferente do sistema operacional (32bits ou 64Bits).