Rodar um aplicativo java como serviço


Queria saber como abrir um programa quando inicializa ou reinicializa com Java? Quando inicia ou reinicia o Linux, automaticamente abre o programa. Sem clicar nele. Abre automaticamente quando o Linux estiver iniciando. Quero usar com o Java, tanto no Linux, Windows e MacOS.

Para que um aplicativo Java seja iniciado automaticamente quando o sistema operacional ligar, o ideal é configurar o próprio sistema operacional para executar o arquivo .jar ou um script que o execute.

Linux (systemd)

A forma mais profissional é criar um serviço do systemd.

1. Criar o arquivo de serviço

Crie:

sudo nano /etc/systemd/system/meuapp.service

Conteúdo:

[Unit]
Description=Meu Aplicativo Java
After=network.target

[Service]
Type=simple
User=usuario
WorkingDirectory=/home/usuario/meuapp
ExecStart=/usr/bin/java -jar /home/usuario/meuapp/MeuApp.jar
Restart=always

[Install]
WantedBy=multi-user.target

2. Ativar o serviço

sudo systemctl daemon-reload
sudo systemctl enable meuapp.service
sudo systemctl start meuapp.service

Verificar:

sudo systemctl status meuapp.service

O programa iniciará automaticamente após cada boot.


Windows

Método 1: Inicialização do Usuário

Crie um arquivo:

@echo off
java -jar C:\MeuApp\MeuApp.jar

Coloque-o em:

C:\Users\USUARIO\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Sempre que o usuário fizer login, o programa abrirá.


Método 2: Serviço do Windows

Use o software:

WinSW (Windows Service Wrapper)

ou

Apache Procrun

Assim o Java será iniciado automaticamente mesmo sem login do usuário.


macOS

LaunchAgent (para o usuário)

Crie:

~/Library/LaunchAgents/com.meuapp.plist

Conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.meuapp</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/java</string>
        <string>-jar</string>
        <string>/Users/usuario/MeuApp/MeuApp.jar</string>
    </array>

    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Ativar:

launchctl load ~/Library/LaunchAgents/com.meuapp.plist

O aplicativo será iniciado automaticamente quando o macOS iniciar.


Solução multiplataforma em Java

O Java não possui uma API padrão que permita registrar automaticamente um programa como serviço em Linux, Windows e macOS ao mesmo tempo.

O mais comum é detectar o sistema operacional:

String os = System.getProperty("os.name").toLowerCase();

if (os.contains("win")) {
    System.out.println("Windows");
} else if (os.contains("mac")) {
    System.out.println("macOS");
} else {
    System.out.println("Linux");
}

e durante a instalação criar:

 


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Window {

    public JFrame janela;
    public JButton botao;

    public void Window() {
        janela = new JFrame();
        janela.setTitle("Hello World Example");
        janela.setSize(200, 200);
        janela.setLocation(500, 260);

        Image Icone = Toolkit.getDefaultToolkit().getImage("icone.png");
        janela.setIconImage(Icone);

        // janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        janela.setLayout(null);

        botao = new JButton();
        botao.setText("Hi!");
        botao.setBounds(25, 10, 150, 25); // objeto.setBounds(esquerda, topo, largura, altura)
        janela.add(botao);

        botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Hello World!");
        }});

        janela.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
        }});

        janela.setVisible(true);
    }

    public static void main(String[] args) {
        Window jx = new Window();
        jx.Window();
    }

}

}

 

java-jar.bat
c:\javac\jdk\bin\javac -source 1.8 -target 1.8 -encoding UTF-8 Window.java
c:\javac\jdk\bin\jar cvfm WindowJAR.jar manifest.txt *.class
manifest.txt
Manifest-Version: 1.0
Main-Class: Window
Created-By: 10.0.1 (Iatagan Cursos)