Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I would like to run my Java program on System Startup on Mac OS/Windows. How can I do this?

Here is what I came up with. It works but I was wondering if there is something more elegant. Thank you!

Misha

/* Copyright (c) 2010 Misha Koshelev. All Rights Reserved.
 *
 * TODO:
 * - Add Linux support
 */
package com.mksoft.common;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * Run specified class within this JAR file on system startup.
 *
 * @author Misha Koshelev
 */
public class RunOnSystemStartup {    
    /*
     * Constants
     */
    protected final static String osName=System.getProperty("os.name");
    protected final static String fileSeparator=System.getProperty("file.separator");
    protected final static String javaHome=System.getProperty("java.home");
    protected final static String userHome=System.getProperty("user.home");

    /*
     * Debugging
     */
    protected static boolean debugOutput=false;
    protected static void debug(String message) {
    if (debugOutput) {
        System.err.println(message);
        System.err.flush();
    }
    }

    /*
     * Helpers
     */
    protected static File getJarFile() throws URISyntaxException {
    return new File(RunOnSystemStartup.class.getProtectionDomain().getCodeSource().getLocation().toURI());
    }
    protected static File getStartupFile() throws Exception {   
    debug("RunOnSystemStartup.getStartupFile: osName=\""+osName+"\"");
    if (osName.startsWith("Windows")) {
        Process process=Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v Startup");
        BufferedReader in=new BufferedReader(new InputStreamReader(process.getInputStream()));
        String result="",line;
        while ((line=in.readLine())!=null) {
        result+=line;
        }
        in.close();
        result=result.replaceAll(".*REG_SZ[ ]*","");
        debug("RunOnSystemStartup.getStartupFile: Startup Directory=\""+result+"\"");

        return new File(result+fileSeparator+getJarFile().getName().replaceFirst(".jar",".bat"));
    } else if (osName.startsWith("Mac OS")) {
        return new File(userHome+"/Library/LaunchAgents/com.mksoft."+getJarFile().getName().replaceFirst(".jar",".plist"));
    } else {
        throw new Exception("Unknown Operating System Name \""+osName+"\"");
    }
    }

    /*
     * Methods
     */

    /**
     * Returns whether this JAR file is installed to run on system startup.
     */
    public static boolean isInstalled() throws Exception {
    return getStartupFile().exists();
    }

    /**
     * Install the specified class from the current JAR file to run on system startup.
     *
     * @param className Name of class within the current JAR file to run on system startup.
     * @param windowTitle Title to display in window title bar, if applicable.
     */
    public static void install(String className,String windowTitle) throws Exception {
    File startupFile=getStartupFile();
    PrintWriter out=new PrintWriter(new FileWriter(startupFile));
    if (osName.startsWith("Windows")) {
        out.println("@echo off");
        out.println("start \""+windowTitle+"\" \""+javaHome+fileSeparator+"bin"+fileSeparator+"java.exe\" -cp "+getJarFile()+" "+className);
    } else if (osName.startsWith("Mac OS")) {
        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        out.println("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">");
        out.println("<plist version=\"1.0\">");
        out.println("<dict>");
        out.println("   <key>Label</key>");
        out.println("   <string>com.mksoft."+getJarFile().getName().replaceFirst(".jar","")+"</string>");
        out.println("   <key>ProgramArguments</key>");
        out.println("   <array>");
        out.println("      <string>"+javaHome+fileSeparator+"bin"+fileSeparator+"java</string>");
        out.println("      <string>-cp</string>");
        out.println("      <string>"+getJarFile()+"</string>");
        out.println("      <string>"+className+"</string>");
        out.println("   </array>");
        out.println("   <key>RunAtLoad</key>");
        out.println("   <true/>");
        out.println("</dict>");
        out.println("</plist>");
    } else {
        throw new Exception("Unknown Operating System Name \""+osName+"\"");
    }
    out.close();
    }

    /**
     * Uninstall this JAR file from the system startup process.
     */
    public static void uninstall() throws Exception {
    File startupFile=getStartupFile();
    if (startupFile.exists()) {
        startupFile.delete();
    }
    }
}
like image 598
Миша Кошелев Avatar asked Jun 01 '10 12:06

Миша Кошелев


1 Answers

Is it a service or a user application? If a service take a look into Java Service Wrapper.

like image 53
Michael Lloyd Lee mlk Avatar answered Oct 13 '22 00:10

Michael Lloyd Lee mlk