java服務安裝(一):使用java service wrapper及maven打zip包

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寨躁,一般是三個步驟

  1. 工程的pom.xml里配置Assembly插件穆碎。
  2. 自定義打包格式的描述符
  3. 運行"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

可參考maven官網(wǎng)的assembly

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的步驟很簡單,主要以下兩步:

  1. 復制必要的wrapper文件到程序需要的目錄中;只有四個目錄是必要的:"bin","conf","lib","logs"敷待,如當前示例中间涵,在main目錄下新建wrapper目錄,復制上面wrapper的的"bin","conf","lib","logs"這四個文件夾到此目錄榜揖。去掉jsw的測試文件勾哩,最后結構如下:
  1. 修改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狈网、附件

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末宙搬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拓哺,更是在濱河造成了極大的恐慌勇垛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件士鸥,死亡現(xiàn)場離奇詭異闲孤,居然都是意外死亡,警方通過查閱死者的電腦和手機烤礁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門讼积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肥照,“玉大人,你說我怎么就攤上這事勤众∮咭铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵们颜,是天一觀的道長吕朵。 經(jīng)常有香客問我,道長掌桩,這世上最難降的妖魔是什么边锁? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮波岛,結果婚禮上茅坛,老公的妹妹穿的比我還像新娘。我一直安慰自己则拷,他們只是感情好贡蓖,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著煌茬,像睡著了一般斥铺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坛善,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天晾蜘,我揣著相機與錄音,去河邊找鬼眠屎。 笑死剔交,一個胖子當著我的面吹牛,可吹牛的內容都是我干的改衩。 我是一名探鬼主播岖常,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼葫督!你這毒婦竟也來了竭鞍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤橄镜,失蹤者是張志新(化名)和其女友劉穎偎快,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洽胶,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡晒夹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惋戏。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖他膳,靈堂內的尸體忽然破棺而出响逢,到底是詐尸還是另有隱情,我是刑警寧澤棕孙,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布舔亭,位于F島的核電站,受9級特大地震影響蟀俊,放射性物質發(fā)生泄漏钦铺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一肢预、第九天 我趴在偏房一處隱蔽的房頂上張望矛洞。 院中可真熱鬧,春花似錦烫映、人聲如沸沼本。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抽兆。三九已至,卻和暖如春族淮,著一層夾襖步出監(jiān)牢的瞬間辫红,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工祝辣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贴妻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓较幌,卻偏偏與公主長得像揍瑟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乍炉,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容