java 压缩jar 仓库,java服务安装(一):使用java service wrapper及maven打zip包

tags: java jsw 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位的也关系不大(除非你的程序需要很大的运算量)。

Apache Commons Daemon著名的Apache Commons工具包的成员,按规则添加启动程序,再编写脚本实现。

其它的(如WinRun4J,Launch4j)未使用过,更多可参考java开源打包工具

本文主要讲解使用java service wrapper把java程序作为windows的服务运行,它不需要添加任何代码,配置即可。

1.3、打包需求

java程序打包一般打成jar包,如果是供其它调用打包成一个jar包上传到仓库,其它人可以引用,这种方式可行,如果它是独立的程序,有其它的额外文件(如配置文件,本文中说的wrapper文件),打成jar包就比较难处理了,因此,更多的情况是把程序把成zip包以便传输,并规定好程序包目录结构,打包时打成一个zip包,解压即用。如下是我经常用到的一种包结构:

2bef0af2c5cec9d33cd8353aedcfb1ed.png

说明:

classes目录:存放所有java编译文件及资源配置文件

lib目录:存放所有程序使用到所有依赖jar

wrapper:所有存放wrapper相关的文件,包括运行脚本bin,wrapper的配置文件conf,wrapper使用的依赖lib,及日志存放目录

因此,需要使用maven把程序打成zip包,解压出来后就是上述的目录结构,可直接运行。

2、程序示例

按前面所说的要求,本文以下面的一个示例进行讲解,示例使用标准maven archetype结构,只实现了一个简单的文件写入内容的功能,使用jsw对程序进行包装,并把它使用maven打包成zip,解压后直接使用jsw的bin下的脚本安装或卸载服务。

d4ee2e39463a87246824ea5952f0e7c3.png

从图中可见,程序很简单,仅一个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插件,请看注释说明:

org.apache.maven.plugins

maven-assembly-plugin

2.2.1

make-wrapper-win-zip

package

single

jsw-test

true

${project.build.directory}

src/main/assembly/wrapper-win-zip.xml

复制代码

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的格式如下所示:

wrapper-win

zip

false

false

/lib

${project.build.directory}/classes

/classes

install/wrapper/windows

/wrapper

复制代码

详细参考官网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位的收费)。

cb8f70ad15aaec111c2b441ec82908aa.png

下载解压后,内容如下:

ecabdbc672207fb746d0daa7326d0aa7.png

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的测试文件,最后结构如下:

cb2ccd37b1151b3c5271fdaed95ebfa6.png

修改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

然后主要设置以下配置(%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、附件

源码:jsw-test.zip ; 密码:3hs5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何处理代码冲突

如何处理代码冲突 冲突合并一般是因为自己的本地做的提交和服务器上的提交有差异,并且这些差异中的文件改动,Git不能自动合并,那么就需要用户手动进行合并 如我这边执行git pull origin master 如果Git能够自动合并,那么过程看…

php试题与答案(二),php面试题附答案二

1、如何实现字符串翻转?function getStr($str){$lenstrlen($str);for ($i0;$i$temp$str[$i];$str[$i]$str[$len-$i-1];$str[$len-$i-1]$temp;}return $str;}echo getStr("abcdef");?>2、apachemysqlphp实现最大负载的方法?个人观点&#x…

如何理解NIO

文章目录1.什么是NIO?2.为什么用NIO,传统IO有什么缺陷?3.NIO和IO的区别4.怎么理解NIO是面向块的、非阻塞的5.NIO是怎么实现的?1.什么是NIO? java.nio全称java non-blocking IO(实际上是 new io&#xff09…

sublime php快捷键,分享Sublime Text 3快捷键精华版!

下面由sublime教程栏目给大家介绍Sublime Text 3 快捷键精华版,希望对需要的朋友有所帮助!CtrlShiftP:打开命令面板CtrlP:搜索项目中的文件CtrlG:跳转到第几行CtrlW:关闭当前打开文件CtrlShiftW&#xff1a…

MyBatis Plus——忽略某个实体类属性和数据库表字段之间的映射关系

问题描述 在开发中可能会遇到MyBatis-Plus使用实体类属性进行SQL操作,但是不用存到数据库中去查找,这时候我们的实体中有这个属性,但是数据库的表中没有这个字段(即:实体类属性非数据库表字段),如果不做处理就会报错。…

php 高德地图计算距离,距离、长度、面积

JS API 为开发者提供了空间数据计算的函数库 AMap.GeometryUtil,可以帮助开发者计算点线面空间关系、长度、面积等函数。更多示例请查看 示例中心本章我们将介绍一些常用的数学计算方法,包括:计算两点间的实际距离 AMap.GeometryUtil.distanc…

@Transient注解作用

java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。 用法 transient 就是在给某个javabean上需要添加个属性,但是这…

Java隐含对象实验报告,JSP隐含对象response实现文件下载

一.简单介绍JSP隐含对象response实现文件下载(1)在JSP中实现文件下载最简单的方法是定义超链接指向目标资源,用户单击超链接后直接下载资源,但直接暴露资源的URL也会带来一些负面的影响,例如容易被其它网站盗链,造成本地服务器下载…

JDBC中使用preparedStatement防止SQL注入

一、SQL注入 SQL注入是一种比较常见的网路攻击方式,一些恶意人员在需要用户输入的地方,恶意输入SQL语句的片段,通过SQL语句,实现无账号登录,甚至篡改数据库。 二、SQL注入实例 登录场景: 在一个登录界面…

Java预科篇1-学前

Java预科篇1-学前 1、markdown语法 Markdown是一种纯文本格式的标记语言。通过简单的标记语法,它可以使普通文本内容具有一定的格式。 优点: 因为是纯文本,所以只要支持Markdown的地方都能获得一样的编辑效果,可以让作者摆脱排…

Java预科篇2-环境搭建

Java预科篇2-环境搭建 1、Java历史 1995年 Java问世1996年 Java 1.01999年 Java 1.2发布(JAVA SE\JAVA EE\JAVA ME)… … …2004年 Tiger 发布(JAVA5.0),Java 登录火星2011年 7月由Oracle正式发布Java7.02014年 3月19日,Oracle公…

php中如何配置环境变量,如何配置phpstorm环境变量如何配置phpstorm环境变量

大话西游6664版。根据你的系统平台下载相应的版本后,如果是压缩文件,先解压后双击运行,不是压缩文件,直接双击运行就可以了,运行后出现下面的界面,在下面界面上单击“Next”。跟所有的软件安装包一样&#…

Java基础篇1——变量与数据类型

Java基础篇1——变量与数据类型 1、标识符命名规则 标识符以由大小写字母、数字、下划线(_)和美元符号($)组成,但是不能以数字开头。大小写敏感不能与Java语言的关键字重名不能和Java类库的类名重名不能有空格、、#、、-、/ 等符号长度无限制应该使用有意义的名称…

php伪静态后301,动态地址rewrite伪静态,然后301跳转到伪静态时死

本文章来给各位同学介绍动态地址rewrite伪静态,然后301跳转到伪静态时死循环解决办法,有碰到此类的朋友可进入参考。问题背景:矿秘书网的历史遗留问题,刚开始由于各种问题,一些动态页面都是用了?id参数的形式&#xf…

Java基础篇2——运算符

Java基础篇2——运算符 1、运算符 1.1、算数运算符 表示加法运算符-表示减法运算符*表示乘法运算符/表示除法运算符%表示取余运算符 1.2、关系运算符 所有以关系运算符作为最终运算的表达式结果一定是boolean类型 >表示是否大于运算符>表示是否大于等于运算符<表…

php 移植 arm 精简,arm linux 移植 PHP

背景&#xff1a;PHP 是世界上最好的语言&#xff0c;所以要考虑php的移植。host平台   &#xff1a;Ubuntu 16.04arm平台   &#xff1a; 3531darm-gcc   &#xff1a;4.9.4主机准备&#xff1a;使用以下脚本### Copyright By Schips, All Rights Reserved# https://git…

Java基础篇3——流程控制

Java基础篇3——流程控制 1、顺序结构 正常代码的流程即是顺序流程 2、分支结构 2.1、if-else分支 if(条件表达式) {语句块1; }if(条件表达式) {语句块1; } else {语句块2; }if(条件表达式1) {语句块1; } else if(条件表达式2) {语句块2; } else {语句块3; }2.2、switc…

hive mysql类型,(二)Hive数据类型、数据定义、数据操作和查询

1.数据类型1.1 基本数据类型Hive数据类型长度例子TINYINT1byte有符号整数20SMALINT2byte有符号整数20INT4byte有符号整数20BIGINT8byte有符号整数20BOOLEAN布尔类型&#xff0c;true或者falseTRUE FALSEFLOAT单精度浮点数3.14159DOUBLE双精度浮点数3.14159STRING字符系列。可以…

Error running tomcat8 Address localhost:1099 is already in use 错误解决

错误情况&#xff1a; 在IDEA上运行web项目时报错&#xff1a;Error running &#xff08;项目名&#xff09; Address localhost:1099 is already in use 解决方法&#xff1a; 第一步&#xff1a;打开Windows运行&#xff0c;如下图 第二步&#xff1a;按下回车或点击确定…

matlab数据处理 书,matlab数据处理记录

最近在看一篇论文&#xff0c;觉得文章的数据处理效果十分的惊艳&#xff01;所以想着如何用matlab将类似的效果实现出来&#xff0c;但最近有一个任务&#xff0c;以后慢慢更新吧&#xff01;先挖一个坑&#xff01;1. 二维图形绘制二维坐标轴图像涉及的部分包含曲线的颜色、点…