tags: java jsw maven zip
1、概述
使用java開發(fā)程序帽芽,在windows平臺下涩维,一般有web應用殃姓,后臺服務應用,桌面應用:
- web應用多數(shù)打成war包在web容器(如tomcat,jetty等)中運行
- 桌面應用一般打成jar包或exe文件運行
- 后臺服務應用一般打成jar包,然后使用命令行(如java -jar xxx.jar)運行
前面兩種運行方式在本文不作討論蜗侈,主要描述java開發(fā)的后臺服務程序(如定時任務程序篷牌,文件處理,數(shù)據(jù)備份等)踏幻。
1.1枷颊、為什么要用服務形式運行
若使用命令行方式運行java程序,把命令寫成腳本(如bat腳本)運行即可叫倍,但命令行方式有其不方便之處偷卧,如命令行窗口不能關閉,關閉即停止吆倦,因此維護人員容易誤操作(關閉窗口使程序停止);若服務器宕機或其它原因听诸,程序往往無法在服務器重啟時自動啟動。在windows下蚕泽,很多程序都是以服務的形式運行晌梨,這也符合windows的管理。因此须妻,建議使用服務形式運行仔蝌,操作方便。
1.2荒吏、如何讓java程序以服務形式運行
有幾種方法可以讓java程序以服務形式運行:
- Java Service Wrapper目前業(yè)界最知名敛惊、最成熟的解決方案,添加任何額外的代碼即可使用绰更,不足之處是收費瞧挤、64位版本需要購買Licence,不過在64位使用32位的也關系不大(除非你的程序需要很大的運算量)儡湾。
- Yet Another Java Service Wrapper類似JSW的開源實現(xiàn)版本特恬,不過官方支持不怎么好。
- Apache Commons Daemon著名的Apache Commons工具包的成員徐钠,按規(guī)則添加啟動程序癌刽,再編寫腳本實現(xiàn)。
- 其它的(如WinRun4J尝丐,Launch4j)未使用過显拜,更多可參考java開源打包工具
本文主要講解使用java service wrapper把java程序作為windows的服務運行,它不需要添加任何代碼摊崭,配置即可讼油。
1.3、打包需求
java程序打包一般打成jar包呢簸,如果是供其它調用打包成一個jar包上傳到倉庫矮台,其它人可以引用乏屯,這種方式可行,如果它是獨立的程序瘦赫,有其它的額外文件(如配置文件辰晕,本文中說的wrapper文件),打成jar包就比較難處理了确虱,因此含友,更多的情況是把程序把成zip包以便傳輸,并規(guī)定好程序包目錄結構校辩,打包時打成一個zip包窘问,解壓即用。如下是我經(jīng)常用到的一種包結構:
說明:
- classes目錄:存放所有java編譯文件及資源配置文件
- lib目錄:存放所有程序使用到所有依賴jar
- wrapper:所有存放wrapper相關的文件宜咒,包括運行腳本bin惠赫,wrapper的配置文件conf,wrapper使用的依賴lib故黑,及日志存放目錄
因此儿咱,需要使用maven把程序打成zip包,解壓出來后就是上述的目錄結構场晶,可直接運行混埠。
2、程序示例
按前面所說的要求诗轻,本文以下面的一個示例進行講解钳宪,示例使用標準maven archetype結構,只實現(xiàn)了一個簡單的文件寫入內容的功能扳炬,使用jsw對程序進行包裝使套,并把它使用maven打包成zip,解壓后直接使用jsw的bin下的腳本安裝或卸載服務鞠柄。
從圖中可見,程序很簡單嫉柴,僅一個java類FileLogger用于寫日志到文件厌杜,使用log4j(1.2.16版本,現(xiàn)在流行slf4j和logback了)輸出日志內容计螺。日志路徑是當前的classpath下的logs目錄夯尽。log4j使用參考它的官網(wǎng),當前我們主要關注以下兩點:
- wrapper文件夾:當前只配置windows登馒,存放jsw的文件匙握,以便把程序包裝為服務安裝。若是linux陈轿,可自行添加文件夾圈纺。
- pom.xml及assembly文件夾:用于maven配置按需打包成zip包秦忿,zip包內容如上面"打包需求"所示。
3蛾娶、maven打zip包
3.1灯谣、maven-assembly-plugin介紹
maven-assembly-plugin是maven中用于構建發(fā)布包的插件,“assembly”是把一組文件蛔琅、目錄胎许、依賴元素組裝成一個歸檔文件,不僅支持創(chuàng)建二進制歸檔文件罗售,也支持創(chuàng)建源碼歸檔文件辜窑。目前Assembly插件支持如下格式的歸檔文件:
- zip 打zip包
- tar.gz 打tar.gz包
- tar.bz2 打tar.bz2包
- jar 打jar包
- dir 直接打包目錄
- war 打war包
使用方法也比較簡單,可參考maven官網(wǎng)的assembly寨躁,一般是三個步驟
- 工程的pom.xml里配置Assembly插件穆碎。
- 自定義打包格式的描述符
- 運行"mvn package"或"mvn assembly:assembly"命令即可
3.2、maven-assembly-plugin配置
如下所示朽缎,在pom.xml文件中的build>plugins元素下配置assembly插件惨远,請看注釋說明:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!-- assembly版本 -->
<version>2.2.1</version>
<executions>
<!-- 若要同時打多個包(如windows和linux不同系統(tǒng)的包),可配置多個execution话肖,此處只打zip北秽,因此配置一個 -->
<execution>
<!-- id標識,唯一即可 -->
<id>make-wrapper-win-zip</id>
<!-- 設置package階段進行 -->
<phase>package</phase>
<goals>
<!-- 只運行一次 -->
<goal>single</goal>
</goals>
<configuration>
<!-- 輸出的最終名稱最筒,自動添加格式后綴(如zip)贺氓,當前示例為jsw-test.zip -->
<finalName>jsw-test</finalName>
<!-- 配置是否添加id到名稱中,若為true床蜘,當前示例中辙培,則為jsw-test-zip.zip,false即不添加邢锯,只是jsw-test.zip扬蕊;
若同時打多個包,則可設為true丹擎,分別添加id以作區(qū)分-->
<appendAssemblyId>true</appendAssemblyId>
<!-- 打包的輸出目錄尾抑,可自定義,${project.build.directory}為編譯輸出目錄蒂培,即target目錄 -->
<outputDirectory>${project.build.directory}</outputDirectory>
<descriptors>
<!-- 使用的描述符再愈,按此描述進行打包,此處配置一個zip.xml表示打zip包 -->
<descriptor>src/main/assembly/wrapper-win-zip.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
assembly插件在pom.xml的配置比較簡單护戳,回答幾個問題即可:
- 在什么時候打包:phase翎冲,
- 打包出來的名稱是什么:finalName
- 是否添加id到名稱后綴:appendAssemblyId
- 打包后輸出到哪里:outputDirectory
- 使用哪個描述符進行打包操作:descriptor
3.3、描述符wrapper-win-zip.xml配置
前面講到要使用一個描述符進行打包操作媳荒,即wrapper-win-zip.xml抗悍,此類文件可統(tǒng)一存放在目錄src/main/assembly中驹饺,以便統(tǒng)一管理。wrapper-win-zip.xml的格式如下所示:
<assembly>
<!-- id標識檐春,唯一即可逻淌,若pom中的appendAssemblyId設置為true,則會添加此id作為后綴 -->
<id>wrapper-win</id>
<formats>
<!-- 打包的格式 -->
<format>zip</format>
</formats>
<!-- 打包的文件不包含項目目錄疟暖,壓縮包下直接是文件 -->
<includeBaseDirectory>false</includeBaseDirectory>
<!-- 配置依賴的輸出 -->
<dependencySets>
<dependencySet>
<!-- 是否把當前項目的輸出jar包并使用卡儒,true則會把當前項目輸出為jar包到輸出目錄,false不輸出 -->
<useProjectArtifact>false</useProjectArtifact>
<!-- 依賴輸出目錄,相對輸出目錄的根目錄俐巴,當前示例把依賴輸出到lib目錄 -->
<outputDirectory>/lib</outputDirectory>
</dependencySet>
</dependencySets>
<!-- 文件輸出 -->
<fileSets>
<fileSet>
<!-- 源目錄骨望,此處是把編譯出來的class文件都輸出到根目錄下的classes目錄-->
<directory>${project.build.directory}/classes</directory>
<!-- 輸出目錄 -->
<outputDirectory>/classes</outputDirectory>
</fileSet>
<fileSet>
<!-- 此處是把wrapper文件全部輸出到根目錄下的wrapper目錄-->
<directory>install/wrapper/windows</directory>
<outputDirectory>/wrapper</outputDirectory>
</fileSet>
</fileSets>
</assembly>
詳細參考官網(wǎng)assembly的配置說明
說明一下,按上述的配置欣舵,使用maven命令進行打包(mvn package
)擎鸠,在target目錄會輸出的是一個jsw-test-wrapper-win包,當前此包名稱不影響程序運行缘圈,讀者可自行個性劣光,包下面直接是三個文件夾(classes,lib,wrapper)。至此糟把,即可以使用maven打出自定義的zip包绢涡。
4、jsw集成java后臺服務
jsw在不添加任何代碼的情況下可以直接使用遣疯,把java程序安裝為windows服務雄可,這樣就可以隨著系統(tǒng)的運行而自動運行。
4.1缠犀、jsw介紹與下載
到java service wrapper官網(wǎng)下載数苫,它支持各種操作系統(tǒng),按系統(tǒng)下載即可辨液,這里講解windows的虐急,下載32位(64位的收費)。
下載解壓后滔迈,內容如下:
- bin:wrapper運行文件及安裝腳本
- conf:配置文件目錄
- doc:說明文檔
- lib:wrapper本身要用到的包和dll文件
- logs:日志目錄
- src:wrapper提供的模板文件(包括bin腳本和conf文件)戏仓,用戶直接復制這里的再修改為自己的腳本即可。
4.2亡鼠、添加jsw到java程序
java程序中添加jsw的步驟很簡單,主要以下兩步:
- 復制必要的wrapper文件到程序需要的目錄中;只有四個目錄是必要的:"bin","conf","lib","logs"敷待,如當前示例中间涵,在main目錄下新建wrapper目錄,復制上面wrapper的的"bin","conf","lib","logs"這四個文件夾到此目錄榜揖。去掉jsw的測試文件勾哩,最后結構如下:
- 修改conf/wrapper.conf文件抗蠢,
一般會把經(jīng)常修改的作為變量放在前面,以便后面配置使用思劳,如當前示例迅矛,會先設置以下變量
rem 程序目錄位置
set.APP_HOME=../..
rem java目錄位置
set.JAVA_HOME=E:/Program Files/Java/jdk1.8.0_51
rem 服務英文名稱
set.SERVICE_EN_NAME=jsw-test
rem 服務中文名稱
set.SERVICE_CH_NAME=jsw測試
rem 服務描述
set.SERVICE_DESCRIPTION=jsw測試
rem 你的Java應用程序的運行類(主類)
set.USER_MAIN_CLASS=service.FileLogger
然后主要設置以下配置(%var%
為變量引用),其它配置按默認即可潜叛。如有個性化需求秽褒,可看官方文檔
- JVM位置:
wrapper.java.command=%JAVA_HOME%/bin/java
- 你的Java應用程序的運行類(主類)
wrapper.app.parameter.1=%USER_MAIN_CLASS%
- 你的Java程序所需的類路徑:
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=%APP_HOME%/classes
wrapper.java.classpath.3=%APP_HOME%/lib/*
- 你的Wrapper.DLL或wrapper.jar所在的目錄
wrapper.java.library.path.1=../lib
- 注冊為服務的名稱和顯示名,你可以隨意進行設置
wrapper.name=%SERVICE_EN_NAME%
wrapper.displayname=%SERVICE_CH_NAME%
wrapper.description=%SERVICE_DESCRIPTION%
- 日志文件位置
wrapper.logfile=../logs/wrapper.log
配置完之后威兜,使用bin下的腳本可進行相應的安裝销斟,卸載操作。
4.3椒舵、安裝與卸載
- 服務安裝
運行InstallTestWrapper-NT.bat即可安裝蚂踊,在日志輸出目錄可查看日志檢查是否正常啟動。安裝成功后可在控制面板-管理程序-服務中看到注冊的服務名稱(當前示例是jsw測試)笔宿,并可進行啟動犁钟、關閉等操作。若啟動失敗泼橘,則需根據(jù)日志輸出檢查(一般是配置問題)涝动。 - 服務卸載
運行UninstallTestWrapper-NT.bat進行卸載服務。
4.4侥加、打包并測試
使用maven打包捧存,mvn package
,按前面的配置担败,即可輸出zip包昔穴,見前面的程序示例,把zip包放到服務提前,解壓吗货,即可使用wrapper安裝服務。
5狈网、附件
- 源碼:jsw-test.zip ; 密碼:
3hs5