2010-06-01 3 views
6

Вот что я придумал. Это работает, но мне было интересно, есть ли что-то более элегантное. Спасибо!Я хотел бы запустить свою программу Java в System Startup в Mac OS/Windows. Как я могу это сделать?

Миша

/* 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(); 
    } 
    } 
} 
+0

Любите, как вы код – Simmant

ответ

1

Это сервис или пользовательское приложение? Если услуга взглянет на Java Service Wrapper.

0

Если вы создать ярлыки в папку Автозагрузка в меню Пуск (либо для текущего пользователя или для всех пользователей, в зависимости от того, когда вы хотите запустить) Windows, будет запустить его при запуске для вы.

0

Спасибо за этот драгоценный камень, я использовал его в своей недавней разработке.

Единственное усовершенствование, которое я использовал в своем подходе, - это строительство плиты. Я включаю шаблон XML в пакет. Затем я использую загрузчик классов для чтения в XML, а затем пишу, используя файл, как вы это делали выше.

(Less улучшение и больше прибраться ниже)

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(); 
} 

Еще раз спасибо за вашу помощь с должности.