1 解釋
java project 我說的是main方法作為程序入口的java工程,有別於 web project。
這樣的工程 一般都是web project的附屬掃描程序或一些獨立的執行程序,如數據同步程序等。
把這樣的project 要部署到生產機上去運行,這樣就涉及到兩個問題:
1 打包問題,我們一般不會把整個工程文件夾給放上去,一般做法是打一個jar包。
2 執行問題 最好的做法就是這些main方法程序的工程 對客戶來說是透明的 就要求工程 發布成windows 的一個服務。並且設置成一 個自動啟動的服務。
2 java project打包解決方案
我們做java project 的開發環境一般是Eclipse,這個開發環境本身就提供了把java project 打包成Jar file的功能。
菜單 File--->Export 選擇相應的java project 設置相應的main方法類 按照向導就可以輕松完成。 但這里有一個很大的不足,就是支持這個java project 正常運行的第三方jar包沒有被打進來。 這個打成的jar包是不能直接運行的。
現在實施時,比較常用的解決方案是 依靠第三方的打包插件來實現打包。比較好的開源插件為 fatjar
下載地址 http://sourceforge.net/projects/fjep/files
在eclipse中安裝好這個插件后,就可以直接用這個插件進行打包,生成 jar文件。
命令中運行這個jar文件。如果想執行jar文件,可以使用java命令的-jar選項。例如,你有一個可以運行的myjar.jar文件。因為該文件是可以執行的,所以你可以用如下命令執行之:java -jar myjar.jar 就可以看到執行效果。
3 java project 的下一站windows服務
把java project 打成可以執行的jar后,並沒有結束。 我們不能要求客戶關機再開機的時候 讓他們去進行 java -jar java -jar myjar.jar 的命令操作 或 雙擊可執行jar包的方式來 啟動獨立運行的java project 程序,我們應該把這個程序的啟動做到客戶透明化。 可以做的就是開機,開機后,一切業務程序就可以自動運行。
4 一個windows的服務的解決方案
比較多的解決方案是 使用 wrapper-windows 這個軟件包。這個軟件包的強大之處是能把jre環境也給打進去,這個服務可以正常運行在根本沒有jre環境即就沒有安裝JDK的機器上。
當然我也是比較喜歡 不把jre環境打到服務里的方式,服務程序的運行依靠本機上安裝的的jre環境。
1 下載wrapper-windows-x86-32-3.2.3版本,並解壓。里面包含 bin conf doc jdoc lib logs src 7個文件夾。
2 新建一個文件夾 如 命名為 myWindowServ,在此文件夾下建立 lib bin conf logs application 5個子文件夾。
3 將 wrapper-windows\src\bin 下的
App.bat.in
InstallApp-NT.bat.in
PauseApp-NT.bat.in
ResumeApp-NT.bat.in
StartApp-NT.bat.in
StopApp-NT.bat.in
UninstallApp-NT.bat.in
復制到bin目錄下,並將后綴為.in的文件全部重命名,去掉.in。例如: App.bat.in重命名為App.bat,
並將wrapper-windows\bin下的wrapper.exe也復制到bin目錄下。
4 將 wrapper-windows\conf 下的文件復制到myWindowServ\conf目錄下。
5 將 wrapper-windows\log 下的文件復制到myWindowServ\logs目錄下。
6 將 wrapper-windows\lib 下的文件復制到myWindowServ\lib目錄下。
7 將需要安裝成服務的java程序打包成jar文件(例如 上面的打包文件 myjar.jar)放到myWindowServ\application下。
8 配置新文件夾conf目錄下的wrapper.conf文件,可以配置運行環境,執行程序,堆內存大小,服務名稱等屬性信息。
這里僅僅列出需要修改和需要注意的地方
8.1 找到wrapper.java.command=java
如果本機已配置了jre,那么此項不需更改;否則的話,需要將jre復制到myWindowServ文件夾路徑下
(如和bin在 同一級,修改wrapper.java.command=../jre/bin/java.exe)
8.2 指定wrapper的啟動方式,用wrapper代理啟動不容易出現問題,不然 老報test.Main不存在的異常。
wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main
修改成
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
8.3 將程序運行需要的jar包都列出來 lib文件夾中的wrapper.jar是必需的
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../application/myjar.jar
8.4 配置程序運行的所需要的內存大小
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64
修改成
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=256
這里是限制服務所占用的最小和最大內存,根據程序運行的效果也可以不改。
8.5 指定程序的主類
如 com.weiguo.mypro.TimerRun 是 myJar打包工程中main方法所在的類,
就需要如下配置:
wrapper.app.parameter.1=com.weiguo.mypro.TimerRun
以下的一些設置 就是服務本身的屬性設置,可以 設置---控制面板--管理工具--服務--隨便選中一個服務--右鍵屬性看到。
8.6 控制台運行時的名稱
wrapper.console.title=TestServer
8.7 指定服務的名稱
wrapper.ntservice.name=TestServer
8.8 windows服務的顯示名稱
wrapper.ntservice.displayname=TestServer
8.9 服務描述
wrapper.ntservice.description=TestServer描述
8.10 啟動模式,默認是自啟動AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
9 運行InstallApp-NT.bat安裝服務,運行StartApp-NT.bat啟動服務。
10 可以暫停,重啟服務 停止服務 PauseApp-NT.bat ResumeApp-NT.bat StopApp-NT.bat
11 如果要卸載這個服務的話,運行UninstallApp-NT.bat卸載服務。
另外一個解釋
Java Service Wrapper功能很強大,同時支持Windows及Un*x平台,提供三種方式把你的Java程序包裝成系統服務,這里只介紹最簡單的一種方式,因這種 方式無需對已有的服務程序作任何改變,僅僅增加幾個script、配置文件就可以把你的Java服務程序改造成系統服務程序了。
當然在使用之前需要到 http://wrapper.tanukisoftware.com/doc/english/download.jsp下載 Service Wrapper的發布包。
下面簡單介紹一下具體的使用步驟:
1. 將下載的Java Service Wrapper包解壓到本地,目錄為{WRAPPER_HOME};
2. 服務應用程序名為MyServApp,在目錄d:\MyServApp下建立bin、conf、logs、lib目錄;並把你的已有應用程序如NioBlockingServer.class拷貝到該目錄下;
3. 將{WRAPPER_HOME}\src\bin\下的遺以下文件拷貝到MyServApp目錄下,並重命名。
C:\ MyServApp\bin\Wrapper.exeà{WRAPPER_HOME}\bin\Wrapper.exe
C:\MyServApp\bin\MyApp.batà{WRAPPER_HOME}\src\bin\App.bat.in
C:\MyServApp\bin\InstallMyApp-NT.batà{WRAPPER_HOME}\src\bin\InstallApp-NT.bat.in
C:\MyServApp\bin\UninstallMyApp-NT.batà{WRAPPER_HOME}\src\bin\UninstallApp-NT.bat.in
4. 將{WRAPPER_HOME}\lib下的以下文件拷貝到C:\ MyServApp \lib目錄下
{WRAPPER_HOME}\lib\Wrapper.DLL
{WRAPPER_HOME}\lib\wrapper.jar
5. 將{WRAPPER_HOME}\src\conf\wrapper.conf.in拷貝到C:\ MyServApp \conf目錄下並命名為wrapper.conf;並修改wrapper.conf文件,在其中配置您的應用服務。
主要修改以下幾項即可:
#你的JVM位置:
wrapper.java.command=D:\Sun\j2sdk1.4.0_03\bin\java
#運行參數:如:
wrapper.java.additional.1=-Dprogram.name=run.bat
#classpath:
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../bin/.
# Java Library Path (location of Wrapper.DLL orlibwrapper.so)
wrapper.java.library.path.1=../lib
#MAIN CLASS 此處決定了使用Java Service Wrapper的方式
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
#你的Java應用類
wrapper.app.parameter.1= NonBlockingServer
# 服務名
wrapper.ntservice.name=NB
# Display name of the service
wrapper.ntservice.displayname=Nio NonblockingServer
# 服務描述
wrapper.ntservice.description=Nio NonblockingServer
其他的配置根據你的需要改變即可
6. 對以上配置的MyApp.bat進行測試,運行MyApp.bat,就像在Console窗口下運行Tomcat一樣;
7. 對以上配置的服務進行測試,運行C:\MyServApp\bin\InstallMyApp-NT.bat將把你的應用(此處為NioBlockingServer)安裝到Win32系統服務中了。
8. 打開控制面板-管理程序-服務,看到Nio Nonblocking Server已經在系統服務中了,其他用法就與我們熟悉的Windows服務一樣了。
Tomcat使用的是Java Service Wrapper模式二,這種方式需要對已有的程序進行小的改動,但可以通過Socket端口的方式控制服務程序核心的啟動,更加靈活。Java Service Wrapper提供的模式三比較復雜,需要作出更多的編碼,我沒有研究。
采用模式一,即可簡單有效的把我們的服務程序包裝成為系統服務程序,並增強了日志功能,我們可以把MyServApp的幾個文件做成模板,每次修改文件名,配置文件就可以了,有精力的朋友更可以做成Eclipse的plugin,鼠標點點就把應用配成服務了。
- 追問:
-
剛才我也下了個wrapper-windows-x86-32-3.2.3.zip 說下具體用法行嗎?
InstallTestWrapper-NT.bat執行這個可以成功安裝,
UninstallTestWrapper-NT.bat執行這個可以成功卸載。
但是怎么把Test Wrapper Sample Application服務換成我寫的java程序呢?
求具體方法。。。。求指教!
- 回答:
- 並把你的已有應用程序如NioBlockingServer.class拷貝到該目錄下
- 追問:
-
wrapper.exe <command> <configuration file> [configuration properties] [...]
wrapper.exe <configuration file> [configuration properties] [...]
(<command> implicitly '-c')
wrapper.exe <command>
(<configuration file> implicitly 'wrapper.conf')
wrapper.exe
(<command> implicitly '-c' and <configuration file> 'wrapper.conf')這個命令有什么用?
- 追問:
-
裝完的服務,可執行文件的路徑是這個
C:\WRAPPER_HOME\bin\wrapper.exe -s C:\WRAPPER_HOME\conf\wrapper.conf
比如我想改成c:\123.exe
要怎么改呢!
- 回答:
-
1. 准備工具
首先下載Java Service Wrapper
要使用Java Service Wrapper,自己原有的程序必須進行一次改造或者添加一個包裝類。這里使用一個最簡單的HelloWorld類作為示例。
package com.yjw;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.tanukisoftware.wrapper.WrapperListener;
import org.tanukisoftware.wrapper.WrapperManager;
// 實現WrapperListener接口
public class HelloWorld implements WrapperListener{
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
frame.setSize(150, 100);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
//這里,啟動HelloWold
WrapperManager.start( new HelloWorld(), args );
}
//需要一個start方法
public Integer start(String[] args) {
System.out.println("start()");
try {
System.out.println("HelloWorld!");
} catch (Exception e) {
}
return null;
}
//需要一個stop方法
public int stop(int exitCode) {
System.out.println("stop(" + exitCode + ")");
return exitCode;
}
//需要一個controlEvent方法
public void controlEvent(int event) {
System.out.println("controlEvent(" + event + ")");
}
}
這里,直接把入口類進行了代碼改造,用戶也可以單獨寫一個包裝類,把上面帶注釋的四個地方的代碼提取出來,對自己原來的入口類進行包裝。
注意:如果沒有對入口類進行java wrapper service需要的代碼改造,則在做成服務后,表現為JVM試圖不停地啟動服務,查看wrapper.log,會發現類似如下的報錯:
INFO | wrapper | 2010/04/16 21:24:58 | Waiting to start...
INFO | wrapper | 2010/04/16 21:25:03 | Waiting to start...
INFO | wrapper | 2010/04/16 21:25:08 | Waiting to start...
ERROR | wrapper | 2010/04/16 21:25:29 | Startup failed: Timed out waiting for a signal from the JVM.
------------------------------------------------------------------------
ADVICE | wrapper | 2010/04/16 21:25:29 |
ERROR | wrapper | 2010/04/16 21:25:29 | JVM did not exit on request, terminated
FATAL | wrapper | 2010/04/16 21:25:29 | There were 5 failed launches in a row, each lasting less than 300 seconds. Giving up.
FATAL | wrapper | 2010/04/16 21:25:29 | There may be a configuration problem: please check the logs.
STATUS | wrapper | 2010/04/16 21:25:29 | <-- Wrapper Stopped將HelloWorld.java打成HelloWorld.jar。
1) 准備工作區
准備一個工作文件夾,例如test,在test下新建conf,log,lib三個文件夾
2) 將下載下來的java wrapper service解壓縮
a) 將Java Service Wrapper包中bin下的wrapper.exe拷貝至test下
b) 將Java Service Wrapper包中src/bin下的App.bat.in(測試運行),InstallApp-NT.bat.in(安裝windows服 務),UninstallApp-NT.bat.in(卸載windows服務)拷貝至test下,並且將后綴.in去掉
c) 修改App.bat,InstallApp-NT.bat,UninstallApp-NT.bat中的set _WRAPPER_CONF="%_REALPATH%conf\wrapper.conf"
d) 將conf文件夾下的wrapper.conf拷貝至test/conf下
e) 將Java Service Wrapper包中lib下的Wrapper.DLL,wrapper.jar拷貝至test/lib下
3) 准備可用jar包
HelloWorld.jar此時還不能直接使用,需要進行改造
a) 將HelloWorld.jar解壓縮,提取META-INF/MANIFEST.MF文件
b) 打開MANIFEST.MF,在Class-Path中追加wrapper.jar wrapper.dll
c) 將HelloWorld.jar和改造過的MANIFEST.MF一起拷貝到%JAVA_HOME%/bin下
d) 打開cmd窗口,將路徑切換至%JAVA_HOME%/bin
e) 輸入命令jar umf MANIFEST.MF HelloWorld.jar,此時HelloWorld.jar中的MANIFEST.MF已被更新為當前的MANIFEST.MF
f) 將更新后的HelloWorld.jar拷貝至test/lib下
4) 配置wrapper.conf
打開test/conf/wrapper.conf
#程序的入口
wrapper.java.mainclass=com.yjw.HelloWorld
#程序jar,包括wrapper.jar
wrapper.java.classpath.1=lib/HelloWorld.jar
wrapper.java.classpath.2=lib/wrapper.jar
#程序的文件夾,這里為lib
wrapper.java.library.path.1=lib
#注意:有的教程注釋為程序的入口,雖然能夠正常運行,但是這是概念性錯誤!
#這個參數指傳給主程序的參數入口,比如筆者有個程序,傳值0表示為英文版,1為中文版,參數就在這里配置。如果有多個參數,請自行配置
#為wrapper.app.parameter.n=XXX
wrapper.app.parameter.1=1
#日志文件生成的位置
wrapper.logfile=log/wrapper.log
#windows服務所需的標題,名稱,顯示名和描述
wrapper.console.title=HelloWorld
wrapper.ntservice.name= HelloWorld
wrapper.ntservice.displayname= HelloWorld
wrapper.ntservice.description= HelloWorld5) 運行App.bat,如果沒有錯誤出現,說明配置正常,就可以運行InstallApp-NT.bat將你的程序做成Windows服務了。所有信息都可以在log/wrapper.log日志文件里找到
6) 如果要打開調試信息,在test/conf/wrapper.conf中將wrapper.debug=TRUE前面的#號去掉即可打開調試功能
- 追問:
-
裝完的服務,可執行文件的路徑是這個
C:\WRAPPER_HOME\bin\wrapper.exe -s C:\WRAPPER_HOME\conf\wrapper.conf
比如我想改成c:\123.jar
要怎么改呢
- 回答:
-
#程序的入口
wrapper.java.mainclass=執行的類名
#程序jar,包括wrapper.jar
wrapper.java.classpath.1=C:/123.jar
- 追問:
-
wrapper.java.classpath.1=C:/123.jar服務安裝了。。。不能啟動
一直顯示wrapper | Waiting to start...
最后就關閉了!
- 回答:
- 程序需要改寫,實現WrapperListener接口
- 追問:
-
能簡單給個例子么 比如開機顯示hello world 對接口不這么熟悉 謝謝了
- 回答:
- 上面不是給了嗎
- 追問:
- .....上面給的不對。。。。。運行不了。。。。不能啟動服務
- 回答:
-
上面只是例子,你的類要implements WrapperListener,然后public Integer start(String[] args) {
實現start,stop,controlEvent這三個方法。
- 追問:
-
沒弄過這個。。。。能給個具體的代碼不。。。整段的
- 回答:
-
import java.io.*;
importorg.tanukisoftware.wrapper.WrapperListener;
importorg.tanukisoftware.wrapper.WrapperManager;
public class Server1 implementsWrapperListener
{
publicstatic void main(String[] args)
{
System.out.println( "Initializing... " );
WrapperManager.start(newServer1(),args);
}
//實現start方法
public Integer start(String[] args) {
System.out.println("start()");
try {
System.out.println("Hello,World!");
} catch (Exception e) {
}
return null;
}
//實現stop方法
public int stop(int exitCode) {
System.out.println("stop(" + exitCode + ")");
return exitCode;
}
//實現controlEvent方法
public void controlEvent(int event) {
System.out.println("controlEvent(" + event + ")");
}
}
- 追問:
-
Server1.java:2: 軟件包 org.tanukisoftware.wrapper 不存在
import org.tanukisoftware.wrapper.WrapperListener;。。。這玩意在哪。。。。
- 回答:
- 在wrapper.jar文件里呀,把它放到classpath里。或者用-cp指定,如:javac -cp wrapper Server.java
- 追問:
-
整體。。。。全套 完全 點。。。。行不
- 回答:
-
這些都是java基礎的吧。
編譯成class后最后就剩打包成jar了,
寫一個manifest.mf文件,里面就兩行:Main-Class: test.Test <回車> ,也就是第二行是空行。
運行jar cvfm Server1.jar manifest.mf Server1
生成jar文件就好了
- 追問:
- ........問的不是這個。。。。javac -cp wrapper Server.java 這個不懂
- 回答:
-
cp的就是classpath的縮寫。
importorg.tanukisoftware.wrapper.WrapperListener;
importorg.tanukisoftware.wrapper.WrapperManager;
這2個都是Java Service Wrap提供的類,編譯的時候,必須在classpath里.
或者把wrapper.jar放在環境變量里的話,或者用javac的時候用cp參數臨時指定到哪里找wrapper.jar。比如
javac -cp d:\wrapper.jar Server.java
轉自:http://blog.csdn.net/kevinlifeng/article/details/9423969