views:

279

answers:

2

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\"&gt;");
        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();
    }
    }
}
A: 

If you create shortcuts in the Startup folder in the Start menu (either for the current user or for All Users depending on when you want it to run) Windows will run it on startup for you.

Haegin
+1  A: 

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

mlk