发布Linux说明(Java代码&部署)
文件里面有该文档的压缩包,可下载下来查看
一、 概要说明
我们的Java程序一般在Windows进行编写,但是真正运行一般是运行于Linux服务器(虽然Java是跨平台的)。JavaEE一般运行于Tomcat下面,而对于我们写的控制台应用程序或是服务就需要单独运行了。
我们可以通过Eclipse导出一个jar文件包,在Windows还是Linux都可以通过命令java –jar xxx.jar直接运行,能够看到运行效果。
二、 Eclipse导出jar文件
1、编写代码
首先创建一个Java Project
如果要导出可执行的jar文件,那么我们的Java程序必须要有一个主方法,格式如下:
有了主方法,程序的相关逻辑代码都放置于主方法之内即可。
2、导出jar(传统方式)
选中需要导出的项目,右键→Export→Runnable JAR file
点击“Next”
按标识选择后点击“Finish”即可。
3、导出jar(Maven方式)
通过传统方式导出的jar包和第三方包是独立存在的,统一放到指定目录即可。我们也可以通过Maven方式导出jar包,导出的jar包和第三方包都统一在一个jar包里面。
1、修改pom.xml
如果我们不修改pom.xml而直接打包,那么打的包里面就没有第三方jar包,这时候执行就会出错,如下:
为了避免这个问题,我们需要修改pom.xml如下
<build> <finalName>ser_json</finalName> <plugins> <!-- 这个插件是解决jdk1.8的问题,和该问题没直接关系--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- 这个插件才是我们需要配置的重点--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId><!-- 注意插件名--> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>cn.zdsoft.App</mainClass><!-- 这里配置主方法的类全路径--> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
如果项目报错,请选择项目并单击鼠标右键→Maven→Update Project…
2、执行打包命令
找到需要打包的项目并单击鼠标右键→Run As→Maven Build…,出现如下界面:
输入打包命令“pakage”之后点击”run”。然后看控制台打印出如下内容:
表示打包成功,那么我们就可以将项目目录下target目录下的jar包拷贝执行了,此时执行正常
4、运行jar文件
导出成功之后目录结构如下:
请不要破环目录结构,直接通过命令 java –jar write_file.jar即可执行该程序
三、 以服务的形式运行
对于C#来说,我们可以创建Windows服务,而Java中可以通过创建控制台应用程序,然后通过nohup的方式在后台运行,也相当于是一个服务。下面对该内容进行说明。
1、程序停止事件
我们以服务的方式运行时,当程序停止时往往会处理很多的业务,因此我们需要注册监听程序停止事件,这样才能保证程序的正确运行而不丢失数据等。首先需要对Java代码的主方法进行修改。修改后的代码如下:
2、以nohup方式运行
然后我们将导出的jar包和第三方jar包复制到Linux系统中,存放于/usr/local/write_file。首先以普通方式运行,结果如下:
通过ctrl+c可以结束程序,同时结束事件也能正常捕获到停止事件
以nohup方式运行,程序将不会在控制台输出,同时将会在jar包统计目录创建一个文件“nohup.out”,输出的内容全部自动存放于该文件中。
命令:nohup java -jar write_file.jar &
3、结束服务
通过普通方式运行可以用ctrl+c的方式结束运行,而通过nohup方式运行则需要两步,第一步查找当前服务的进程编码,第二步结束进程编码。
查找进程编码:ps -ef|grep write_file.jar
结束编码:kill xxxx
重点说明:
结束服务时非特殊情况不可使用 kill -9 xxxx。因为这种方式相当于Windows的结束进程,那么我们程序无法监听到停止事件,除非程序异常而无法正常停止时使用。
正常情况请使用kill xxxx。
四、 守护程序Supervisor
jar文件运行之后难免会存在异常关闭的情况,为了让程序能在异常关闭后自动启动并继续运行,因此我们需要部署一套进程守护系统,经过多方面对比决定使用Supervisor进行线程守护。本来Supervisor的官网有详细介绍(听说),但是打不开,官网地址:http://supervisord.org/。
同时本人学习的过程参照了http://www.cnblogs.com/Hai--D/p/5820718.html。在此表示感谢。
1、安装
安装的方式比较简单,就两个命令如下:
1、yum install python-setuptools
2、easy_install supervisor
2、配置
1、创建目录:/etc/supervisor
2、执行命令echo_supervisord_conf > /etc/supervisor/supervisord.conf 将会自动在目录/etc/supervisor下创建配置文件supervisord.conf,同时配置文件的内容也已初始化
3、打开配置文件supervisord.conf,把最后两行的内容修改如下:
[include]
files = conf.d/*.conf
4、创建目录/etc/supervisor/conf.d,同时在该目录下创建文件ProjectName.conf(ProjectName代表需要监控的项目名称)
5、打开ProjectName.conf,然后添加内容如下(注意分号后面是注释,可省略):
[program: ProjectName] command=nohup java -jar ProjectName.jar &; 运行程序的命令 directory=/root/Publishing/PublishOutput/ ; 命令执行的目录 autorestart=true ; 程序意外退出是否自动重启 autostart=true ; 是否自动启动 stderr_logfile=/var/log/ProjectName.err.log ; 错误日志文件 stdout_logfile=/var/log/ProjectName.out.log ; 输出日志文件 ;environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量 user=root ; 进程执行的用户身份 stopsignal=INT startsecs=1 ; 自动重启间隔
6、启动
supervisord -c /etc/supervisor/supervisord.conf
7、查看运行状态
ps -ef | grep ProjectName
如下,表示成功
如果在执行supervisord命令时出现如下错误:
Error: Another program is already listening on a port that one of our HTTP servers is configured to use.
Shut this program down first before starting supervisord.
For help, use /usr/bin/supervisord –h
则表示Supervisor已经启动,可以通过命令supervisorctl shutdown终止它。
3、开机启动
1、在目录/usr/lib/systemd/system/下创建文件supervisord.service
supervisord.service文件内容如下:
[Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
2、执行命令,启动开机启动服务
systemctl enable supervisord
提示
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
3、验证是否为开机启动
systemctl is-enabled supervisord
提示enabled表示成功
4、命令汇总
4.1 启动Supervisor
supervisord -c /etc/supervisor/supervisord.conf
4.2 停止Supervisor
supervisorctl shutdown
4.3 查看所有任务状态
supervisorctl status
4.4 关闭所有任务
supervisorctl shutdown
4.5启动或停止服务
supervisorctl stop|start program_name
五、附件