it-swarm-pt.tech

Como criar um serviço do windows a partir de Java app

Acabei de herdar um aplicativo Java que precisa ser instalado como um serviço no XP e no Vista. Já faz 8 anos desde que eu usei janelas de qualquer forma e eu nunca tive que criar um serviço, muito menos de algo como um Java aplicativo (eu tenho um jar para o aplicativo e uma única jar de dependência - log4j). Qual é a mágica necessária para fazer isso funcionar como um serviço? Eu tenho a fonte, então modificações de código, embora preferivelmente evitadas, são possíveis.

207
ideasculptor

Eu tive alguma sorte com o Java Service Wrapper

66
sblundy

Apache Commons Daemon é uma boa alternativa. Tem Procrun para serviços do windows, e Jsvc para daemons unix. Ele usa uma licença Apache menos restritiva, e o Apache Tomcat a usa como parte de si mesmo para rodar no Windows e no Linux! Para fazê-lo funcionar é um pouco complicado, mas existe um artigo exaustivo com exemplo de trabalho.

Além disso, você pode olhar para o bin\service.bat em Apache Tomcat para ter uma idéia de como configurar o serviço. No Tomcat eles renomear os binários Procrun (prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Algo que eu me esforcei com o Procrun, seus métodos start e stop devem aceitar os parâmetros (String [] argv). Por exemplo, "start (String [] argv)" e "stop (String [] argv)" funcionaria, mas "start ()" e "stop ()" causariam erros. Se você não puder modificar essas chamadas, considere criar uma classe de bootstrapper que possa massagear essas chamadas para atender às suas necessidades.

94
mcdon

Com Apache Commons Daemon agora você pode ter um nome e ícone executável personalizado! Você também pode obter um monitor de bandeja do Windows personalizado com seu próprio nome e ícone!

Agora tenho meu serviço em execução com meu próprio nome e ícone (prunsrv.exe) e o monitor da bandeja do sistema (prunmgr.exe) também tem meu próprio nome e ícone personalizados!

  1. Faça o download do binários do Apache Commons Daemon (você precisará do prunsrv.exe e do prunmgr.exe).
  2. Renomeie-os para MyServiceName.exe e MyServiceNamew.exe respectivamente.
  3. Baixe WinRun4J e use o programa RCEDIT.exe que vem com ele para modificar o executável do Apache para incorporar seu próprio ícone personalizado como este:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
    
  4. Agora instale seu serviço do Windows como este (veja documentação para mais detalhes e opções):

    > MyServiceName.exe //IS//MyServiceName \
      --Install="C:\path-to\MyServiceName.exe" \
      --Jvm=auto --Startup=auto --StartMode=jvm \
      --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \
      --StartClass=com.mydomain.MyClassWithMainMethod
    
  5. Agora você tem um serviço do Windows do seu Jar que funcionará com seu próprio ícone e nome! Você também pode iniciar o arquivo do monitor e ele será executado na bandeja do sistema com seu próprio ícone e nome.

53
11101101b

Mais uma opção é WinRun4J . Este é um configurável Java launcher que funciona como um host de serviço do Windows (versões de 32 e 64 bits). É open source e não há restrições ao seu uso.

(divulgação completa: Eu trabalho neste projeto).

25
Peter Smith

Uma maneira simples é o NSSM Wrapper Wrapper ( veja minha entrada no blog ).

25
Giordano Maestro

Outra resposta é Yet Another Java Service Wrapper , isso parece ser uma boa alternativa ao Java Service Wrapper, assim como melhor licenciamento. Também se destina a ser fácil passar de JSW para YAJSW. Certamente, para mim, novinha em folha em servidores Windows e tentando fazer com que um aplicativo Java fosse executado como um serviço, era muito fácil de usar.

Alguns outros eu encontrei, mas não acabei usando:

  • Java Service Launcher Eu não usei isso porque parecia mais complicado trabalhar do que o YAJSW. Eu não acho que isso é um invólucro.
  • JSmooth A criação dos serviços da Window não é seu objetivo principal, mas pode ser feito . Eu não usei isso porque não há atividade desde 2007.
17
atomicules

Eu acho que o Java Service Wrapper funciona bem. Note que existem três formas para integrar sua aplicação. Parece que a opção 1 funcionará melhor se você não quiser alterar o código. O arquivo de configuração pode ficar um pouco louco, mas lembre-se que (para a opção 1) o programa que você está iniciando e para o qual você estará especificando argumentos, é o programa auxiliar, que iniciará seu programa. Eles têm um exemplo de arquivo de configuração para isso.

6
Ed Thomas

JavaService é LGPL. É muito fácil e estável. Altamente recomendado.

4
NT_

Se você usar o Gradle Build Tool, você pode tentar o my windows-service-plugin , o que facilita o uso do Apache Commons Daemon Procrun .

Para criar um aplicativo de serviço do Windows Java com o plugin, você precisa passar por várias etapas simples.

  1. Crie uma classe de serviço principal com o método apropriado.

    public class MyService {
    
        public static void main(String[] args) {
            String command = "start";
            if (args.length > 0) {
                command = args[0];
            }
            if ("start".equals(command)) {
                // process service start function
            } else {
                // process service stop function
            }
        }
    
    }
    
  2. Inclua o plug-in no seu arquivo build.gradle.

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0"
      }
    }
    
    apply plugin: "com.github.alexeylisyutenko.windows-service-plugin"
    

    O mesmo trecho de script para o novo mecanismo de plug-in incubado introduzido no Gradle 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  3. Configure o plugin.

    windowsService {
      architecture = 'AMD64'
      displayName = 'TestService'
      description = 'Service generated with using gradle plugin'   
      startClass = 'MyService'
      startMethod = 'main'
      startParams = 'start'
      stopClass = 'MyService'
      stopMethod = 'main'
      stopParams = 'stop'
      startup = 'auto'
    }
    
  4. Executar createWindowsService gradle tarefa para criar uma distribuição de serviço do Windows.

Isso é tudo que você precisa fazer para criar um serviço simples do Windows. O plug-in baixará automaticamente os binários do Apache Commons Daemon Procrun, extrairá esses binários no diretório de distribuição de serviços e criará arquivos em lote para instalação/desinstalação do serviço.

No diretório ${project.buildDir}/windows-service, você encontrará executáveis ​​de serviço, scripts em lote para instalação/desinstalação do serviço e todas as bibliotecas de tempo de execução. Para instalar o serviço, execute <project-name>-install.bat e, se quiser desinstalar o serviço, execute <project-name>-uninstall.bat. Para iniciar e parar o serviço, use o executável <project-name>w.exe.

Observe que o início do serviço de manipulação de método deve criar e iniciar um thread separado para executar o processamento e, em seguida, retornar. O método principal é chamado de threads diferentes quando você inicia e pára o serviço.

Para mais informações, por favor leia sobre o plugin e Apache Commons Daemon Procrun.

4
Alexey Lisyutenko

Use " winsw " que foi escrito para o Glassfish v3 mas funciona bem com os programas Java em geral.

Requer o tempo de execução do .NET instalado.

3
Thorbjørn Ravn Andersen

Com Java 8, podemos lidar com esse cenário sem nenhuma ferramenta externa. javapackager ferramenta vem com Java 8 fornece uma opção para criar pacotes configuráveis ​​de aplicativos independentes:

-native type Gerar bundles de aplicativos independentes (se possível). Use a opção -B para fornecer argumentos aos empacotadores que estão sendo usados. Se type for especificado, apenas um pacote desse tipo será criado. Se nenhum tipo for especificado, tudo será usado.

Os valores a seguir são válidos para o tipo:

-native type
Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used.

The following values are valid for type:

all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified.
installer: Runs all of the installers for the platform on which it is running.
image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed.
dmg: Generates a DMG file for OS X.
pkg: Generates a .pkg package for OS X.
mac.appStore: Generates a package for the Mac App Store.
rpm: Generates an RPM package for Linux.
deb: Generates a Debian package for Linux.

No caso de janelas consulte o seguinte doc podemos criar msi ou exe, conforme necessário.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
3
Steephen

Eu não gostei do licenciamento para o Java Service Wrapper. Eu fui com o ActiveState Perl para escrever um serviço que faz o trabalho.

Pensei em escrever um serviço em C #, mas minhas restrições de tempo eram muito restritas.

2
Hugh Buchanan

Eu sempre uso apenas sc.exe (consulte http://support.Microsoft.com/kb/251192 ). Ele deve ser instalado no XP do SP1, e se não estiver no seu sabor do Vista, você pode baixá-lo com o kit de recursos do Vista.

Eu não fiz nada muito complicado com Java, mas usar um argumento de linha de comando totalmente qualificado (x:\Java.exe ....) ou criar um script com Ant para incluir depencies e definir parâmetros funciona bem para mim.

2
Kevin

é simples como você tem que colocar um atalho

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) ou User home directory(%userProfile%)

Windows 10: Em Executar Shell:startup

em sua propriedade -> atalho -> alvo -> Java.exe -jar D:\..\runJar.jar

NOTA: Isto irá rodar somente após o seu login


com direito de administrador

sc create serviceName binpath= "Java.exe -jar D:\..\runJar.jar" Criará o serviço do Windows

se você obtiver tempo limite use cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war mas mesmo assim você obterá o tempo limite, mas no plano de fundo Java.exe será iniciado. Verifique no gerenciador de tarefas

NOTA: Isso será executado na inicialização do logon do Windows (antes do login, com base no serviço 'Startup Type')

Explicação detalhada da criação do serviço do windows

2
Ravi Parekh

Uma boa comparação de diferentes soluções está disponível em: http://yajsw.sourceforge.net/#mozTocId2845

Pessoalmente gosto de launch4j

2
pushNpop

Eu usei JavaService antes com bom sucesso. Ele não foi atualizado em alguns anos, mas foi bem sólido quando eu o usei.

2
Jason

No momento, estou exigindo isso para executar um aplicativo baseado no Eclipse, mas preciso definir algumas variáveis ​​primeiro que são locais para esse aplicativo. sc.exe só permitirá executáveis, mas não scripts, então eu voltei para autoexnt.exe que faz parte do Windows 2003 resource kit . Ele restringe o serviço a um único arquivo de lote, mas eu só preciso de um script em lote para ser convertido em um serviço.

tchau!

1
ramfree17

Outra boa opção é FireDaemon . É usado por algumas grandes lojas como a NASA, IBM, etc; veja o site deles para obter uma lista completa.

1
Andrew Swan