Como criar um serviço Windows a partir do aplicativo java

220

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

ideasculptor
fonte
Uma outra sugestão stackoverflow.com/a/9262081/381897
bhdrkn 13/14
1
Apenas para completar: aqui serverfault.com/a/259195, ele diz que o aplicativo precisa responder aos retornos de chamada do Service Control Manager. Leia este tutorial usa Procrun ticklingmind.blogspot.com/2010/03/...
Broken_Window
Outra resposta stackoverflow.com/questions/5953525/…
Ravi Parekh

Respostas:

69

Tive alguma sorte com o Java Service Wrapper

esplêndido
fonte
11
O Java Service Wrapper parece muito útil. Mas dei uma olhada na lista de recursos. Você só precisa estar ciente de que a versão da comunidade não está licenciada para uso no servidor.
Brian Matthews
Isso pode ser um problema. Foi há alguns anos que eu usei. Acho que eles decidiram cobrar.
sblundy
Esse wrapper é usado por muitos projetos de código aberto, incluindo vários no Jakarta Apache, como o ActiveMQ.
Todd
7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Uso de código fechado A GPL não impede que o software privado seja desenvolvido para uso interno, o que depende do software da GPL, desde que esse software nunca seja distribuído sem gerar a fonte completa de todo o aplicativo disponível para todos os usuários. Embora incentivemos usuários corporativos e governamentais a usarem um Servidor ou Contrato de Licença de Desenvolvimento, o Contrato de Licença da Comunidade é aceitável desde que o aplicativo seja para uso interno ou seja sempre distribuído junto com seu src completo.
285 Vladimir Vladimir
1
@Vladimir tanuki embalagem não aberta é proveniente de 64 bits arco
gerrytan
100

O Apache Commons Daemon é uma boa alternativa. Possui Procrun para serviços do Windows e Jsvc para daemons unix. Ele usa licença Apache menos restritiva, e o Apache Tomcat a usa como parte de si mesma para executar no Windows e Linux! Fazê-lo funcionar é um pouco complicado, mas há um artigo exaustivo com um exemplo prático.

Além disso, você pode consultar o bin \ service.bat no Apache Tomcat para ter uma idéia de como configurar o serviço. No Tomcat, eles renomeiam os binários Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

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

mcdon
fonte
Usando a reflexão, você provavelmente poderia contornar o problema que declarou no seu último parágrafo. Além disso, o apache commons daemon é o único wrapper que conheço que possui binários de 64 bits pré-criados para uso gratuito.
precisa saber é o seguinte
Você precisa de um retorno de carro entre cada Opções da JVM. Por exemplo, se você tiver na mesma linha -Dopt1 = a -Dopt2 = b, pode não funcionar. Para corrigi-lo, você precisa escrever --JvmOptions=-Dopt=a#-Dopt2=b. Eu estava executando o comando a partir de um script de formiga e lutei por dias por causa disso. Espero que ajude.
Sydney
O artigo sobre o qual você falou não existe mais ... Você ainda tem uma maneira de chegar a ele? Estou tendo problemas para que o Apache Commons Daemon faça o que eu preciso.
11101101b
3
@ 11101101b, apache parece ter anexado as entranhas do artigo para a sua própria página wiki ...
Lucas
@ wiki da comunidade, usei o Apache Commons Daemon para máquinas Windows de 64 bits, adicionando o serviço com sucesso. enquanto eu estiver usando os mesmos processos para a máquina Windows 7 de 32 bits, ele falha ao adicionar serviço.
precisa
59

Com o Apache Commons Daemon, agora você pode ter um nome e ícone executável personalizado! Você também pode obter um monitor de bandeja personalizado do Windows 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 possui meu próprio nome e ícone personalizados!

  1. Faça o download dos binários do Apache Commons Daemon (você precisará de prunsrv.exe e prunmgr.exe).
  2. Renomeie-os para serem MyServiceName.exee MyServiceNamew.exerespectivamente.
  3. Baixe o WinRun4J e use o RCEDIT.exeprograma que acompanha o produto 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 o serviço do Windows como este (consulte a documentação para obter 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 Windows do seu Jar que será executado 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.

11101101b
fonte
1
Eu fiz tudo de acordo com o seu Como, mas isso não muda o ícone do systray .. alguma idéia do porquê?
outofBounds
Desculpe @outofBounds, eu não vi seu comentário até agora. O programa RCEDIT.exe é o que modifica o ícone do executável do serviço. Verifique se você possui um arquivo .ico válido com cada tamanho definido corretamente. Você pode ver como criar um arquivo .ico adequado aqui: stackoverflow.com/questions/4354617/…
11101101b
2
Só para você saber, você não pode ter espaços no nome do serviço.
11101101b
1
Sim, @ Shakthi, ele funciona bem no Windows XP, 7, 8, 8.1, Server 2003, 2008 e 2012 de 32 e 64 bits.
11101101b
1
Sim, @Syamsoul Azrein, funciona muito bem no 10 e em qualquer edição de servidor.
11101101b
31

Uma maneira simples é o NSSM Wrapper Wrapper ( veja a entrada do meu blog ).

Giordano Maestro
fonte
7
ROCHAS DO NSSM! Eu fácil faz wrapper mesmo do meu programa java. Fácil, leve, funciona - 100kb de felicidade! Obrigado!
cynepnaxa
1
Qualquer exemplo, como usar o NSSM Wrapper para iniciar a instância do aplicativo java (estou usando o HelioSearch) como um serviço do Windows em segundo plano na inicialização do sistema?
Krunal
@ GiordanoMaestro sua entrada do blog não está mais acessível. Você tem outro link?
Matthieu
2
Comparado com Apache Commons Daemon, wrapper.tanukisoftware.org, & yajsw, NSSM foi de longe a opção mais rápida e mais fácil para transformar um aplicativo java simples em um serviço do Windows
Jeffrey Cavaleiro
Estou tentando usar o NSSM para executar meu jar executável de inicialização de primavera. Eu recebi este erro, "Status inesperado SERVICE_PAUSED em resposta ao controle START".
precisa saber é o seguinte
26

Mais uma opção é o WinRun4J . Este é um lançador java configurável que funciona como um host de serviço do Windows (versões de 32 e 64 bits). É de código aberto e não há restrições quanto ao seu uso.

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

Peter Smith
fonte
3
Obrigado por isso. Eu tentei o YAJWS e primeiro ele me assustou com o download de 19mb e, depois de seguir as instruções, ele mostrou "erro ao analisar a linha de comando". Eu olhei para o PROCRUN e é muito complicado para uma configuração rápida. INSTSRV / SRVANY requer alterações no registro! O Launch4J compacta um JAR dentro de um EXE, o que complica as implantações. WinRun4J foi um ajuste perfeito. A única desvantagem é que ela requer uma classe especial para trabalhar como serviço (em vez de simplesmente chamar a classe principal padrão). Mas no geral é 99% perfeito.
Fernacolo 16/05
2
Para sua informação, a versão mais recente possui um invólucro para uma classe principal padrão.
Peter Smith
Oi, você pode dar algum exemplo que explique como usar isso? Gostaria de usá-lo para iniciar a instância do HelioSearch como um serviço do Windows em segundo plano na inicialização do sistema.
Krunal
17

Ainda outra resposta é Ainda outro Java Service Wrapper , essa parece ser uma boa alternativa ao Java Service Wrapper, pois possui melhor licenciamento. Também se pretende que seja fácil passar de JSW para YAJSW. Certamente para mim, novo nos servidores Windows e tentando fazer com que um aplicativo Java funcionasse como um serviço, era muito fácil de usar.

Encontrei outros, mas não acabei usando:

  • Java Service Launcher Não usei isso porque parecia mais complicado começar a trabalhar do que o YAJSW. Eu não acho que isso seja um invólucro.
  • Os serviços do JSmooth Creating Window não são seu objetivo principal, mas podem ser realizados . Não usei isso porque não há atividade desde 2007.
átomos
fonte
+1 de mim, pois essa foi a solução mais rápida para mim "pronta para uso" e nenhuma modificação no aplicativo java foi necessária, o que é uma vantagem definitiva.
Green Day
Encontrei este gráfico de comparação muito atraente que comparava o YAJSW com alguns outros wrappers de serviço comuns. yajsw.sourceforge.net/#mozTocId284533
Verde
6

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

Ed Thomas
fonte
5

Se você usa a Gradle Build Tool, pode experimentar o meu windows-service-plugin , que facilita o uso do Apache Commons Daemon Procrun .

Para criar um aplicativo de serviço java windows com o plug-in, é necessário seguir 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 build.gradlearquivo.

    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 snippet 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. Execute a tarefa de classificação createWindowsService para criar uma distribuição de serviço do Windows.

É tudo o 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 para o diretório de distribuição de serviços e criará arquivos em lote para instalação / desinstalação do serviço.

No ${project.buildDir}/windows-servicediretório, 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.bate se você deseja desinstalar o serviço <project-name>-uninstall.bat. Para iniciar e parar o serviço, use <project-name>w.exeexecutável.

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

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

Alexey Lisyutenko
fonte
Resposta subestimada!
TaylanUB
4

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

NT_
fonte
4

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

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

Os seguintes valores 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 do windows, consulte o documento a seguir , podemos criar msi ou exe conforme necessário.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
fonte
4
Esta resposta não aborda a questão. O javapackager não pode ser usado para criar um serviço do Windows diretamente, mas sim criar um executável independente que, por exemplo, inclua o jre e outros recursos.
Tobias_
3

é simples como você tem que colocar um atalho

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

Windows 10: Em execução shell:startup

em sua propriedade -> atalho -> destino -> java.exe -jar D:\..\runJar.jar

NOTA: Isso será executado somente após o login


Com direito de administrador

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

se você usar o tempo limite,cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war mas mesmo assim, o tempo limite será excedido, mas em segundo plano o java.exe será iniciado. Check-in gerenciador de tarefas

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

Explicação detalhada da criação de serviço do Windows

Ravi Parekh
fonte
3

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

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

Thorbjørn Ravn Andersen
fonte
Enquanto isso, a versão atual (mantida pelo conhecido Kohsuke Kawaguchi) está localizada aqui .
precisa saber é o seguinte
Parece que ele mudou para o github após a versão 1.9 (provavelmente quando ele passou do Oracle para o Cloudbees).
Thorbjørn Ravn Andersen
2

Eu usei o JavaService antes com bom sucesso. Não foi atualizado em alguns anos, mas era bastante sólido quando eu o usei.


fonte
GForge foi descontinuado
lww
2

Não gostei do licenciamento do Java Service Wrapper. 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 limitadas.

Hugh Buchanan
fonte
Você pode fornecer o exemplo de hack que você fez com "perl" ..!
peaceUser
2

Eu sempre uso o sc.exe (consulte http://support.microsoft.com/kb/251192 ). Ele deve ser instalado no XP a partir do SP1 e, se não for do seu agrado do Vista, você pode fazer o download e carregá-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 dependências e definir parâmetros funciona bem para mim.

Kevin
fonte
1
Isso permite que você inicie algo como um serviço, mas, no meu entendimento, ele seria desanexado, ou seja, você não poderia pará-lo por meio dos Serviços ou reiniciar automaticamente, etc. Eu poderia estar completamente errado - apenas comecei a investigar isso.
atomicules
1

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

Andrew Swan
fonte
1

Atualmente, estou exigindo que isso execute um aplicativo baseado em Eclipse, mas preciso primeiro definir algumas variáveis ​​locais para esse aplicativo. O sc.exe permitirá apenas executáveis, mas não scripts, então eu virei para o autoexnt.exe, que faz parte do kit de recursos do Windows 2003 . Ele restringe o serviço a um único arquivo em lote, mas eu só preciso que um script em lote seja convertido em um serviço.

tchau!


fonte
-1

O Exe4j é uma opção muito boa, embora não seja gratuito. Confira em Exe4j No assistente para criar o arquivo .exe, você tem a opção de criar um serviço.

RAM
fonte