項目中有一個java應用程序,交付後用戶要求要把這個程序作成後臺服務程序,即:系統啓動後該程序能夠自動啓動,而且在前臺不要出現運行窗口,維護人員只要在「服務管理」(Windows)中選擇啓動或中止便可.
解決辦法以下:
Linux
在Linux中註冊後臺服務程序相對容易,只需編輯/etc/init.d/boot.local文件,在boot.local文件里加上下面這句腳本:windows

其中run.sh是java應用的運行腳本
Windows
在Windows下的狀況較爲複雜,須要使用Windows提供的兩個工具:instsrv.exe(下載)和Srvany.exe(下載).
instsrv: 這個工具是把win32程序變成系統服務。
基本用法:tomcat
因爲應用的需求,須要把Java App做爲NT服務來運行,因而就找來了Java service wrapper這個工具來幫忙了。官方網址:http://wrapper.tanukisoftware.org/doc/english /download.jsp。
Java Service Wrapper提供了4種方式來Java App註冊爲服務運行(Integration Methods)。
- 使 用 WrapperSimpleApp幫助類來啓動應用。 這種方法是最簡單的方法。使用這種方法須要注意的是Java Service Wrapper中止Java App的時候不會調用Java App的相應的接收方法,而是直接調用System.exit()來結束Java App。
- 使 用 WrapperStartStopApp幫助類來啓動應用。這種方法假設Java App有相應的啓動,中止類。由ClassX負責啓動Java App,ClassY負責中止Java App。固然了,具體使用的時候也能夠用同一個類來啓動或者中止Java App,只要初始化該類的不一樣啓動或中止參數就能夠了。
- 使 用WrapperManager類來啓動應用。這種方法是最靈活的啓動方式,並且須要Java App的啓動類必須實現 WrapperListener接口。 WrapperListener接口有start(String[] arg0)和stop(int arg0)方法,須要Java App的啓動類來實現。這就就能夠用WrapperManager類來管理Java App的主類了。
- 使用 WrapperJarApp 幫助類來啓動應用。這種方法和WrapperSimpleApp幫助類類似,只是使用這種方法的時候,Java App要求打包爲可執行的Jar文件。
我使用第二種方式啓動本身的Java App。下載Java Service Wrapper後首先是copy一些文件到本身的Java App應用相應的目錄下。給目錄的結構相似下面這個樣子:
src
|
|--bin
| |--wrapper.exe
| |--App.bat
| |--InstallApp-NT.bat
| |--UninstallApp-NT.bat
|
|--conf
| |--wrapper.conf
|
|--lib
| |--Wrapper.dll
| |--Wrapper.jar
|
|--logs
| |--wrapper.log
|
|--<Your own Source Classes here>
固然了,若是你的應用程序已經寫好了,不行改變已有目錄的名稱,那就修改Java Service Wrapper的配置文件吧。好比conf文件目錄原來的名稱爲configuration,那就你就能夠修改bin目錄下引用wrapper.conf 的bat文件中相應的地方便可。
而後就是配置文件wrapper.conf的修改了。
wrapper .java .command=java : 指定要運行的Java .若是已經設定了Java的環境變量,這裏能夠不修改;若是沒有,可使用絕對路徑指向 JDK bin 目錄下的java。
wrapper .java .mainclass=org.tanukisoftware.wrapper.WrapperStartStopApp: 指定要運行的幫助類,這個類是上面說的4中方式的啓動類之一。Java Service Wrapper是用本身的類來啓動應用程序,並把實際要啓動的Java應用程序的主類做爲該類的第一個參數傳進去。
wrapper .java .classpath.1=../lib/wrapper .jar :配置Java 的類路徑,這裏的將 wrapper .jar 也包含在內,這裏能夠設置參數的位置,並且這個位置必須得從 1 開始,不能跳過,必須順序指定,指定類路徑的時候還有根據依賴關係來排列 , 被依賴的排在前面,不然會出現ClassNotFoundException 的錯誤,這裏支持絕對路徑和相對路徑,也支持通配符 "*" ,好比 wrapper .java .classpath.1=../lib/wrapper * , 不過這個通配符只能用於匹配文件名,不能用於匹配文件夾名稱。固然了,這裏也必須添加上當前目錄或者上一級目錄,取決於你的主類所在的目錄。
wrapper .java .library.path.1=../lib: 指定Wrapper 自帶的類庫文件存放文件夾,好比 Wrapper .DLL 文件等,只要指定到對應的上級目錄名稱就行,支持通配符。
wrapper .app.parameter.1= : 指啓動類,如上面說的ClassX 。
wrapper .app.parameter.2= : 指啓動類main方法須要的參數個數 。
wrapper .app.parameter.3= : 指啓動類main方法的實際參數,依次列出。
wrapper .app.parameter.x= : 實際參數。
wrapper .app.parameter.y= : 指中止類,如上面說的ClassY 。固然了,也能夠和啓動類同樣爲ClassX,可是須要參數來區分相應的操做。
wrapper .console.title=Java App : 控制檯窗口顯示標題,
wrapper .ntservice.name=Service Name: 系統服務的名稱 ,
wrapper .ntservice.displayname= Service Name : 在服務管理中顯示的名稱
wrapper .ntservice.description= Service Name 的介紹信息 : 在服務管理器顯示服務的描述信息
wrapper .ntservice.starttype=AUTO_START: 配置服務啓動方式,能夠選擇AUTO_START( 自動 ) 和 DEMAND_START( 手動 ) 兩種方式。默認爲自動。