一、前言
由於防止維護人員誤操作關閉Java控制台程序,因此決定將其改造為以Windows服務的形式運行。弄了一個上午總算搞定了,下面記錄下來,以供日后查閱。
二、Java Service Wrapper
官網地址:http://wrapper.tanukisoftware.com/doc/english/download.jsp
JavaServiceWrapper以守護進程或windows服務的方式運行java程序。JSW提供四種方案改造原有項目,以實現守護進程或windows服務的方式運行。而且還提供JVM監控功能和自動重啟功能,反正十分強大的樣子。
方式1:WrapperSimpleApp
用於通過同一個類實現啟動和關閉的程序。
官方推薦使用該方式加工原有項目,好處是簡單,且不用修改原有項目的代碼。
步驟1:下載並解壓得到工具包,目錄結構如下
/
|-- bin,wrapper控制windows服務的bat文件
|-- conf,wrapper配置文件
|-- doc,教程
|-- lib,wrapper的依賴包
|-- logs,日志
|-- src,模板
|-- conf
|-- bin
步驟2:搭建項目結構:新建項目發布目錄(假設為agent),然后將src下的conf和bin復制到agent下,並且將conf和bin下的文件重命名,去掉`.in`后綴。然后將bin/wrapper.exe復制到agent/bin/下,再將lib復制到agent下,得到目錄結構如下
agent
|-- lib
|-- wrapper.dll
|-- wrapper.jar
|-- conf
|-- wrapper.conf
|-- bin
|-- wrapper.exe
|-- 一堆bat文件
最后將原有項目的文件復制到bin目錄下。
步驟3:配置agent/conf/wrapper.conf的參數
# 配置java命令路徑 wrapper.java.command=jre/bin/java # 配置CLASSPATH路徑(並不會修改全局的環境變量) # 若原有項目還依賴其他jar包,均需要添加進來 wrapper.java.classpath.1=../lib/wrapper.jar wrapper.java.classpath.2=. # 配置lib路徑 wrapper.java.library.path.1=../lib # 配置服務的main class(就是原有項目的程序入口類) wrapper.app.parameter.1=agent.Daemon # 配置wrapper日志文件 wrapper.logfile=logs/Agent.log # 配置系統服務名稱 wrapper.ntservice.name=AgentService # 配置系統服務顯示的名稱 wrapper.ntservice.displayname=AgentService # 配置系統服務描述 wrapper.ntservice.description=AgentService # 配置系統服務的啟動方式,取值范圍是AUTO_START或DEMAND_START wrapper.ntservice.starttype=AUTO_START # 配置內存溢出則重啟服務 wrapper.filter.trigger.1001=Exception in thread "*" java.lang.OutOfMemoryError wrapper.filter.allow_wildcards.1001=TRUE wrapper.filter.action.1001=RESTART wrapper.filter.message.1001=The JVM has run out of memory.
步驟4:安裝、卸載服務
點擊對應的Install.bat和Uninstall.bat即可。
2. 方式2:WrapperStartStopApp
用於像tomcat那樣,啟動程序和關閉程序是分開的項目。該方式同樣不用修改原來項目的代碼。
3. 方式3:WrapperListener
該方式需要修改原來項目的代碼,但最靈活。
4. 方式4:WrapperJarApp
用於原有項目已經打包為jar或war包的情況,配置方式與`WrapperSimpleApp`相似,但`wrapper.app.parameter.1=jar或war包路徑`。該方式同樣不用修改原來項目的代碼
三、總結
官方文檔以JBOSS為例子說明WrapperSimpleApp的使用,十分不好懂,幸好有前人記錄實操過程我才從苦海得救,感謝感謝。
尊重原創,轉載請注明來自:http://www.cnblogs.com/fsjohnhuang/p/4019267.html ^_^肥仔John
四、參考
http://blog.csdn.net/arjick/article/details/4526392