将Java应用程序作为Windows服务安装

这听起来像是您不需要的东西,但是有时候,当您分发最终用户软件时,可能需要将Java程序安装为Windows服务。 我之所以必须这样做,是因为我开发了一种用于公务员的工具 ,可以自动将其Excel文件转换并将其推入我国的opendata门户。 该工具必须定期运行,因此它是服务的主要候选者(即使公务员完全忘记了此任务,这也可以使上传成为可能,此外,重复的手动上传是浪费时间)。

尽管有很多关于该主题的文章和stackoverflow答案,但是由于一些小的警告和很少有人看到的一个重要先决条件,我仍然花了很多时间–捆绑了JRE,因此没有人需要下载并安装一个JRE(不必要地使安装过程复杂化,并且目标受众不一定精通技术)。

因此,对于带有jar打包的Maven项目,我首先想到了打包一个exe(带有launch4j ),然后将其注册为服务。 这样做的问题是Java程序使用调度的执行程序,因此它永远不会退出,这使它无法作为进程启动。

因此,我不得不使用commons-daemon procrun“对其进行守护” 。 在此之前,我必须将所需的每个组件组装到一个目标文件夹中,即胖子jar(包括所有依赖项),JRE,commons-daemon二进制文件和配置文件。

您可以在此处查看完整的maven文件 。 相关位是(其中${installer.dir}${project.basedir}/target/installer} ):

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration>
</plugin>
<plugin><artifactId>maven-assembly-plugin</artifactId><executions><execution><id>assembly</id><phase>package</phase><goals><goal>single</goal></goals><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><finalName>opendata-ckan-pusher</finalName><appendAssemblyId>false</appendAssemblyId></configuration></execution></executions>
</plugin>
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.7</version><executions><execution><id>default-cli</id><phase>package</phase><goals><goal>run</goal></goals><configuration><target><copy todir="${installer.dir}/jre1.8.0_91"><fileset dir="${project.basedir}/jre1.8.0_91" /></copy><copy todir="${installer.dir}/commons-daemon"><fileset dir="${project.basedir}/commons-daemon" /></copy><copy file="${project.build.directory}/opendata-ckan-pusher.jar" todir="${installer.dir}" /><copy file="${project.basedir}/install.bat" todir="${installer.dir}" /><copy file="${project.basedir}/uninstall.bat" todir="${installer.dir}" /><copy file="${project.basedir}/config/pusher.yml" todir="${installer.dir}" /><copy file="${project.basedir}/LICENSE" todir="${installer.dir}" /></target></configuration></execution></executions>
</plugin>

您将注意到installer.bat和uninstaller.bat,它们是使用commons-daemon管理服务的文件。 安装程序将创建服务。 Commons-daemon具有三种模式:exe(允许您包装任意可执行文件),Java(类似于exe,但适用于Java应用程序)和jvm(以相同的过程运行Java应用程序;我不知道如何完全一样)。

我可以使用所有三个选项(包括launch4j创建的exe),但是jvm允许您使用指定的方法来控制正在运行的应用程序。 StartClass / StartMethod / StopClass / StopMethod参数适用于此。 这是整个installer.bat:

commons-daemon\prunsrv //IS//OpenDataPusher --DisplayName="OpenData Pusher" --Description="OpenData Pusher"^--Install="%cd%\commons-daemon\prunsrv.exe" --Jvm="%cd%\jre1.8.0_91\bin\client\jvm.dll" --StartMode=jvm --StopMode=jvm^--Startup=auto --StartClass=bg.government.opendatapusher.Pusher --StopClass=bg.government.opendatapusher.Pusher^--StartParams=start --StopParams=stop --StartMethod=windowsService --StopMethod=windowsService^--Classpath="%cd%\opendata-ckan-pusher.jar" --LogLevel=DEBUG^ --LogPath="%cd%\logs" --LogPrefix=procrun.log^--StdOutput="%cd%\logs\stdout.log" --StdError="%cd%\logs\stderr.log"commons-daemon\prunsrv //ES//OpenDataPusher

一些澄清:

  • Jvm参数指向jvm dll(老实说,如果机器上没有其他Java安装,我不确定这是否可以工作;应该)
  • StartClass / StartMethod / StopClass / StopMethod指向用于控制正在运行的应用程序的指定方法。 在这种情况下,启动将仅调用main方法,而停止将关闭计划的执行程序,以便应用程序可以退出
  • classpath参数指向胖子
  • 使用%cd%确定当前目录的路径是有风险的,但是由于最终用户将始终从其所在目录启动它,因此在这种情况下是安全的。

windowsService看起来像这样:

public static void windowsService(String args[]) throws Exception {String cmd = "start";if (args.length > 0) {cmd = args[0];}if ("start".equals(cmd)) {Pusher.main(new String[]{});} else {executor.shutdownNow();System.exit(0);}
}

这里的一个重要说明是您可能遇到的32位/ 64位问题。 这就是为什么捆绑32位JRE并使用32位(默认)prunsrv.exe更安全的原因。

然后,我有了一个“安装程序”文件夹,其中包含jre和commons-daemon文件夹,以及两个bat文件和一个胖罐。 然后,我可以将其打包为可自解压的归档文件,并进行分发(当然需要使用手册)。 我也研究了IzPack ,但找不到如何捆绑JRE(也许可以)。

那是一个相当小众的场景–通常我们是为部署到Linux服务器而开发的,但是有时可能需要使用Java为大型组织提供本地工具。 就我而言,长期运行的部分是预定的执行程序,但它也可以运行提供Web界面的码头服务。 在访问本地计算机很重要的情况下,为什么要这样做而不是提供URL。 它甚至可以是分布式搜索引擎( 例如 )或您要用Java编写的其他p2p软件。

翻译自: https://www.javacodegeeks.com/2016/06/installing-java-application-windows-service.html

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

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

相关文章

怎样实现banner自动播放html,纯CSS3实现banner图片自动轮播效果方式总结

自动轮播&#xff1a;实现切换图片&#xff0c;图片循环播放&#xff1b;鼠标悬停某张图片&#xff0c; 则暂停切换。css方法一、opacity控制透明度实现轮播效果依照需求咱们选择用CSS3的animation动画进行实现&#xff1b;transition动画须要触发才能启动&#xff0c;html因此…

你好a+b(非入门)

题目传送门&#xff1a;https://www.nowcoder.com/acm/contest/165/A来源&#xff1a;牛客网 牛牛刚学习了输入输出&#xff0c;他遇到了一道这样的题目。 输入2个整数a和b保证输入的a和b在long long范围之内&#xff0c;即满足-9223372036854775808 < a, b < 9223372036…

/etc/sysconfig/i18n文件详解

编辑/etc/sysconfig/i18n这个文件&#xff0c; 不管你装的是中文版,还是英文版.删掉原来的设置,把下面的拷贝过去 LANG"zh_CN.GB18030" SUPPORTED"zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT"latarcyrheb-sun16" 保存,重起.OK了 这时…

201771010112罗松《面向对象程序设计(java)》第三周学习总结

实验三 Java基本程序设计 201771010112 罗松 1、实验目的与要求 &#xff08;1&#xff09;进一步掌握Eclipse集成开发环境下java程序开发基本步骤&#xff1b; &#xff08;2&#xff09;熟悉PTA平台线上测试环境&#xff1b; &#xff08;3&#xff09;掌握Java语言构造基本…

构建openjdk镜像_在Windows上构建OpenJDK

构建openjdk镜像通过做一些实验&#xff0c;我发现手头提供JDK源代码来进行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我决定下载并编译该野兽。 显然&#xff0c;这花了我一些时间&#xff0c;尽管我最初的想法是&#xff0c;它应该和运行make命令一样简单:…

html图像特征提取,图像识别之图像特征提取

图像识别之图像特征提取HOG特征&#xff1a;方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处置中用来停止物体检测的特征描绘子。它经过计算和统计图像部分区域的梯度方向直方图来构成特征。Hog特征分离SVM分类器曾经被普遍应用于图像辨认…

190. 颠倒二进制位

题目 代码 class Solution { public:uint32_t reverseBits(uint32_t n) {n(n>>16)|(n<<16);n((n&0xff00ff00)>>8)|((n&0x00ff00ff)<<8);n((n&0xf0f0f0f0)>>4)|((n&0x0f0f0f0f)<<4);n((n&0xcccccccc)>>2)|((n&am…

Linux--date命令 date命令

Linux--date命令 date命令 date命令的功能是显示和设置系统日期和时间。 该命令的一般格式为&#xff1a; date [选项] 显示时间格式&#xff08;以开头&#xff0c;后面接格式&#xff09; date 设置时间格式 命令中各选项的含义分别为&#xff1a; -d datestr, --date datest…

为某人命名以重新连接到您的服务器

在进行测试自动化时&#xff0c;通常需要知道当前计算机的名称&#xff0c;以提示另一台计算机连接到它&#xff0c;特别是在并行运行测试的情况下。 本周&#xff0c;我试图对服务器进行测试&#xff0c;以使其连接回在从属测试计算机上运行的WireMock服务器。 堆栈溢出的标准…

as转html5工具,将keras的h5模型转换为tensorflow的pb模型

背景&#xff1a;目前keras框架使用简单&#xff0c;很容易上手&#xff0c;深得广大算法工程师的喜爱&#xff0c;但是当部署到客户端时&#xff0c;可能会出现各种各样的bug&#xff0c;甚至不支持使用keras&#xff0c;本文来解决的是将keras的h5模型转换为客户端常用的tens…

暑假第六周

刘思翔来深圳玩&#xff0c;陪玩 转载于:https://www.cnblogs.com/cts1234/p/9664244.html

linux shell数据重定向(输入重定向与输出重定向)详细分析

在了解重定向之前&#xff0c;我们先来看看linux 的文件描述符。 linux文件描述符&#xff1a;可以理解为linux跟踪打开文件&#xff0c;而分配的一个数字&#xff0c;这个数字有点类似c语言操作文件时候的句柄&#xff0c;通过句柄就可以实现文件的读写操作。 用户可以自定义文…

计算机科学技术的教育应用论文,浅谈计算机科学技术在计算机教学中的应用论文...

计算机科学&#xff0c;研究计算机及其周围各种现象和规律的科学&#xff0c;亦即研究计算机系统结构、程序系统(即软件)、人工智能以及计算本身的性质和问题的学科。计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科&#xff0c;从抽象的算法分析、形式化语法…

socketserver和socket的补充(验证客户端合法性)

一、socket的补充 1、参数 socket.socket(familyAF_INET,typeSOCK_STREAM,proto0,filenoNone) 参数说明&#xff1a; family 地址系列应为AF_INET(默认值ipv4),AF_INET6(ipv6),AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域实际上是使用本地 socket 文件来通信) type 套接字类型应为…

使用Spring Boot和Spring Security验证JWT

对于我当前的项目&#xff0c;我将使用Spring Boot设置REST API &#xff08;最有可能使用BoxFuse运行&#xff09;。 为了能够使用API​​端点&#xff0c;应用程序将检查传入的请求是否具有较早提供的有效JWT令牌 &#xff08;由我信任的API服务提供&#xff09;。 为了实现…

怎么查看linux文件夹下有多少个文件

ls | wc -w是查看有多少个文件及文件夹ls | wc -c这个查看目录下多少个文件. 使用wc命令 具体通过wc --help 可以查看。如&#xff1a;wc -l filename 就是查看文件里有多少行 wc -w filename 看文件里有多少个word。 wc -L filename 文件里最长的那一行是多少个字…

[转]xargs详解

为什么要用xargs&#xff0c;问题的来源 在工作中经常会接触到xargs命令&#xff0c;特别是在别人写的脚本里面也经常会遇到&#xff0c;但是却很容易与管道搞混淆&#xff0c;本篇会详细讲解到底什么是xargs命令&#xff0c;为什么要用xargs命令以及与管道的区别。为什么要用x…

计算机桌面图片怎么设置大小,怎么设置桌面壁纸大小

很多人都知道怎麽设置电脑桌面&#xff0c;可真正找到适合自己屏幕的可能很少&#xff0c;图片或大或小&#xff0c;小编为大家分享了设置桌面壁纸大小的方法&#xff0c;下面大家跟着小编一起来了解一下吧。设置桌面壁纸大小方法先查看自己电脑屏幕分辨率&#xff0c;方法&…

html5 clip,canvas中使用clip()函数裁剪方法

未使用裁剪绘制一个圆*{margin:0;padding:0;}html,body{width:100%;height:100%;overflow:hidden;background-color:#AFAFAF;}varcanvasdocument.getElementById(canvas),contextcanvas.getContext(2d);canvas.widthdocument.body.clientWidth;canvas.heightdocument.body.clie…

linux中管道符的简单使用

管道符&#xff0c;可以把两条命令连起来&#xff0c;具体来说有两种应用&#xff0c;如下&#xff1a; 1. 例如&#xff1a; ps aux | grep "media" 在 ps aux中的結果中查找media。 2. 例如&#xff1a; find . -name "*.cpp" | xargs grep "cl…