java服务安装(一):使用java service wrapper及maven打zip包
1、概述
使用java开发程序,在windows平台下,一般有web应用,后台服务应用,桌面应用:
- web应用多数打成war包在web容器(如tomcat,jetty等)中运行
- 桌面应用一般打成jar包或exe文件运行
- 后台服务应用一般打成jar包,然后使用命令行(如java -jar xxx.jar)运行
前面两种运行方式在本文不作讨论,主要描述java开发的后台服务程序(如定时任务程序,文件处理,数据备份等)。
1_1、为什么要用服务形式运行
若使用命令行方式运行java程序,把命令写成脚本(如bat脚本)运行即可,但命令行方式有其不方便之处,如命令行窗口不能关闭,关闭即停止,因此维护人员容易误操作(关闭窗口使程序停止);若服务器宕机或其它原因,程序往往无法在服务器重启时自动启动。在windows下,很多程序都是以服务的形式运行,这也符合windows的管理。因此,建议使用服务形式运行,操作方便。
1_2、如何让java程序以服务形式运行
有几种方法可以让java程序以服务形式运行:
- Java Service Wrapper目前业界最知名、最成熟的解决方案,添加任何额外的代码即可使用,不足之处是收费、64位版本需要购买Licence,不过在64位使用32位的也关系不大(除非你的程序需要很大的运算量)。
- Yet Another Java Service Wrapper类似JSW的开源实现版本,不过官方支持不怎么好。
- Apache Commons Daemon著名的Apache Commons工具包的成员,按规则添加启动程序,再编写脚本实现。
- 其它的(如WinRun4J,Launch4j)未使用过,更多可参考java开源打包工具
本文主要讲解使用java service wrapper把java程序作为windows的服务运行,它不需要添加任何代码,配置即可。
1_3、打包需求
java程序打包一般打成jar包,如果是供其它调用打包成一个jar包上传到仓库,其它人可以引用,这种方式可行,如果它是独立的程序,有其它的额外文件(如配置文件,本文中说的wrapper文件),打成jar包就比较难处理了,因此,更多的情况是把程序把成zip包以便传输,并规定好程序包目录结构,打包时打成一个zip包,解压即用。如下是我经常用到的一种包结构:
说明:
- classes目录:存放所有java编译文件及资源配置文件
- lib目录:存放所有程序使用到所有依赖jar
- wrapper:所有存放wrapper相关的文件,包括运行脚本bin,wrapper的配置文件conf,wrapper使用的依赖lib,及日志存放目录
因此,需要使用maven把程序打成zip包,解压出来后就是上述的目录结构,可直接运行。
2、程序示例
按前面所说的要求,本文以下面的一个示例进行讲解,示例使用标准maven archetype结构,只实现了一个简单的文件写入内容的功能,使用jsw对程序进行包装,并把它使用maven打包成zip,解压后直接使用jsw的bin下的脚本安装或卸载服务。
从图中可见,程序很简单,仅一个java类FileLogger用于写日志到文件,使用log4j(1.2.16版本,现在流行slf4j和logback了)输出日志内容。日志路径是当前的classpath下的logs目录。log4j使用参考它的官网,当前我们主要关注以下两点:
- wrapper文件夹:当前只配置windows,存放jsw的文件,以便把程序包装为服务安装。若是linux,可自行添加文件夹。
- pom.xml及assembly文件夹:用于maven配置按需打包成zip包,zip包内容如上面”打包需求”所示。
3、maven打zip包
3_1、maven-assembly-plugin介绍
maven-assembly-plugin是maven中用于构建发布包的插件,“assembly”是把一组文件、目录、依赖元素组装成一个归档文件,不仅支持创建二进制归档文件,也支持创建源码归档文件。目前Assembly插件支持如下格式的归档文件:
- zip 打zip包
- tar.gz 打tar.gz包
- tar.bz2 打tar.bz2包
- jar 打jar包
- dir 直接打包目录
- war 打war包
使用方法也比较简单,可参考maven官网的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不同系统的包),可配置多个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以作区分-->
<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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
assembly插件在pom.xml的配置比较简单,回答几个问题即可:
- 在什么时候打包:phase,
- 打包出来的名称是什么:finalName
- 是否添加id到名称后缀:appendAssemblyId
- 打包后输出到哪里:outputDirectory
- 使用哪个描述符进行打包操作:descriptor
3_3、描述符wrapper-win-zip.xml配置
前面讲到要使用一个描述符进行打包操作,即wrapper-win-zip.xml,此类文件可统一存放在目录src/main/assembly中,以便统一管理。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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
详细参考官网assembly的配置说明
说明一下,按上述的配置,使用maven命令进行打包(mvn package
),在target目录会输出的是一个jsw-test-wrapper-win包,当前此包名称不影响程序运行,读者可自行个性,包下面直接是三个文件夹(classes,lib,wrapper)。至此,即可以使用maven打出自定义的zip包。
4、jsw集成java后台服务
jsw在不添加任何代码的情况下可以直接使用,把java程序安装为windows服务,这样就可以随着系统的运行而自动运行。
4_1、jsw介绍与下载
到java service wrapper官网下载,它支持各种操作系统,按系统下载即可,这里讲解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文件
一般会把经常修改的作为变量放在前面,以便后面配置使用,如当前示例,会先设置以下变量
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
然后主要设置以下配置(%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测试),并可进行启动、关闭等操作。若启动失败,则需根据日志输出检查(一般是配置问题)。 - 服务卸载
运行UninstallTestWrapper-NT.bat进行卸载服务。
4_4、打包并测试
使用maven打包,mvn package
,按前面的配置,即可输出zip包,见前面的程序示例,把zip包放到服务,解压,即可使用wrapper安装服务。
5、附件
java服务安装(一):使用java service wrapper及maven打zip包的更多相关文章
- 利用Java Service Wrapper将java项目添加到windows服务中
1.web项目,即tomcat/resin添加至window系统服务,步骤如下:第一步:找到tomcat的bin目录,如:D:\apache-tomcat-8.0.26\bin第二步:打开cmd,cd ...
- 使用JavaService.exe(amd64)发布java服务(jdk x64)
最近项目中需要使用java服务,但是java服务已经写好了,就等待部署到windows服务中,遇到了种种困难------在x64服务器中部署jdk x64编译的jar时,遇到了各种纠结. 本文找到了一 ...
- Win2008R2+java+tomcat安装
Win2008R2+java+tomcat安装 准备软件: jdk-7u25-windows-x64.exe apache-tomcat-7.0.42-windows-x64.zip 一.安装java ...
- Ubuntu 14.04下 Java通用安装方法
参考: 解决Floodlight1.2+Mininet问题及使用安装 Ubuntu下安装JDK1.7图文详解 Ubuntu 14.04下 Java通用安装方法 1.到oracle官网下下载对应jdk包 ...
- Java Service Wrapper将jar包安装成Windows服务
刚接触java,第一次使用Java开发windows服务,也是刚不久看了SSM框架 简直也是一头雾水,不过只要用心理解,其实很简单,下面有详细的步骤,包学包会 在windows上运行jar包,需要在工 ...
- 利用JAVA Service Wrapper把JAVA程序做成windows服务
今天做了一个读取数据入库的程序.由于读取的数据每天都更新,于是就想把程序做成一个服务,每天定时执行.研究了一下,发现有几种方式可以做.下面我主要记录一下JAVA Service Wrapper方式. ...
- Java Service Wrapper将java程序设置为服务
有时候我们希望我们java写的程序作为服务注册到系统中,Java Service Wrapper(下面简称wrapper)是目前较为流行的将Java程序部署成Windows服务的解决方案, 本文将讨论 ...
- Java Service Wrapper 发布Java程序为Windows服务
下载Windows版本:https://www.krenger.ch/blog/java-service-wrapper-3-5-37-for-windows-x64/ 转自:F:\java\bhGe ...
- Java Service Wrapper 发布Java程序或者jar包为Windows服务
下载Windows版本:http://nchc.dl.sourceforge.net/sourceforge/wrapper/wrapper-windows-x86-32-3.2.3.zip 现在目前 ...
随机推荐
- ES,ZK,Mysql相关参数优化
1.ES 内存调优: vi config/jvm.options -Xms16g -Xmx16g 2.Zookeeper参数配置调优 2.1\在conf目录下 vi java.env export J ...
- Ubuntu使用日志2(在Eclipse中搭建C++交叉编译环境)
Release用交叉编译:arm-none-linux-gnueabi-gcc. 搭建步骤: 1).在Project->Properties->C/C++ Build->Settin ...
- 10. 修改端口号【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51637017 spring boot 默认端口是8080,如果想要进行更改的话,只需要修改 ...
- Android SqliteOpenHelper详解
一. SQLite介绍 SQLite是android内置的一个很小的关系型数据库. SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息. 博客中有一篇有稍微 ...
- Win10 导航窗口不能移动文件win10 资源管理器 无法拖动文件到左侧驱动器
Win10 导航窗口不能移动文件怎么办 Win10左侧导航栏不能移动文件怎么办 win10 资源管理器 无法拖动文件到左侧驱动器怎么办 在同一个文件夹可以拖动来移动文件,拖到地址栏的面包屑也可以移动文 ...
- Dungeon Master ZOJ 1940【优先队列+广搜】
Problem Description You are trapped in a 3D dungeon and need to find the quickest way out! The dunge ...
- <context:annotation-config/>、<context:component-scan/>
在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredA ...
- 高效抽取loading,再多的载入页面也不怕
当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...
- Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...
- Hadoop-2.6.0上调用C的API实现相似云盘的功能
Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传.下载.删除,重命名) 測试系统:CentOS6.6, hadoop-2.6.0 本次測试是调用hadoop下的C的API来訪问HDFS ...