I would like to run my Java program in 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 was anything more elegant. Thanks!

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(); } } } 
+6
source share
3 answers

Is this a service or a custom application? If the service views Java Wrapper .

+1
source

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 to start it), Windows will start it at startup.

0
source

Thanks for this gem, I used it in my recent development.

The only improvement I used in my approach was the plist build. I am including an XML template in a package. Then I use the class loader to read in XML and then write using the file, as you did above.

(Less improvement and a more accurate look, see below)

 private String loadPlistXML() { StringBuilder file = new StringBuilder(); try{ is = this.getClass().getClassLoader().getResourceAsStream("LaunchPList.xml"); logger.info("is = " + (is != null)); BufferedReader in = new BufferedReader(new InputStreamReader(is)); String line = null; while((line = in.readLine()) != null) { file.append(line +"\n"); } }catch(Error e){ e.printStackTrace(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return file.toString(); } 

Thanks again for helping with the original post.

0
source

All Articles