在本篇文章中我将详细介绍下在linux服务器上用shell脚本发布java工程的步骤。 这是本人第一次写脚本发布程序,尽管写的很烂,但还是写出来和大家分享下。而且我个人认为这个小脚本可以做为一个模板通用。
吹下水,好了进入正题。
假设我们在eclipse中有一个名为ShellTest的工程,现在需要将该工程放在linux服务器上运行,下面给出在服务器上用脚步来控制程序启动的详细步骤。
1.将工程打包为shellTest.jar(jar名根据工程意思任意指定),并将该工程要用的其它jar一起拷贝到lib目录下2.在与lib目录同级的目录下新建一个目录如bin,用来存放脚步文件
我在bin目录下定义一个名为testshell.sh的脚本,testshell.sh内容如下:
#!/bin/bash
export MY_JAR_PATH=../lib/ #指定工程的jar包所在文件路径(如本文中将工程打的jar包和工程需用的jar文件统一放在与该脚步本件同级的lib目录下,所以这里为../lib)export LC_CTYPE=zh_CN.gbk #没置本地语言环境
PATH=/usr/lib/jvm/java-6-sun/bin:$PATH #指定java PATH环境变量,
JAVA_HOME=/usr/lib/jvm/java-6-sun/bin #指定java安装路径
CLASSPATH="."
for jar in $MY_JAR_PATH*.jar
do
CLASSPATH=$CLASSPATH:$jar #将lib目录下的jar包加载到环境变量中,注意linux下jar包之间的分隔符是:,而windows下是;
done
export PATH=$PATH
export JAVA_HOME=$JAVA_HOME
export CLASSPATH=$CLASSPATH
#下面自定义一个函数用于处理在运行程序时出现问题时给出报警信息
function warn()
{
echo $1 #接受第一个参数
#如有报警脚本这里也可以调用对应的报警脚步来处理
}
#为了避免当程序由于没有正常执行而退出,然而用户却多次执行该脚本启动程序导致有多个进程的情况,这里可以用一个变量(如我采用在程序启动时判定一个文件tmp.lock是#否存在,若存在说明上次启动java程序没有正常启动,内存中已有对应进程存,提醒用户检查程序,待程序检查完后最好把已存在的该java进程kill掉,然后删除该tmp.lock,再#次执行本脚本来启动java程序)
if [ -f tmp.lock ];then #判断文件是否存在,若存在则调用warn函数给出警报退出程序
warn "需要报警的提示消息" #调用warn函数 同时传入一个参数,所以warn函数中$1就表示接受调用warn函数时传入的第一个参数
exit -1
fi
>tmp.lock #若前面正常执行说明是第一次或上次程序正常执行,此时在发布我们的java程序前这里重定向生成一个tmp.lock的空文件,其作用如前面判定tmp.lock文件所解释
./othershell.sh #这里假设让其它脚本执行,则直接调用即可:脚步文件路径/脚本文件名
if [ $? -ne 0 ] #判断上一条语句或函数是否成功执行(是否不等于0),$?表示上一条语句或函数的返回码,0表示成功执行,非0表示上一条语句或函数执行过程中出现异常或 非正常退出
then
warn "需要报警的提示消息"
exit 1
fi
java -Xms50m -Xmx3000m -XX:-UseGCOverheadLimit com.daen.com.test.ShellTest shellTest >> out #启动java程序:java -Xms50m -Xmx3000m -XX:- #UseGCOverheadLimit分配jvm环境,com.daen.com.test.ShellTest包名+程序入口类名,shellTest自定义一个别名,方便查看进程,>>out将程序中打印结果(如log输出信息)输出到out文件中
if [ $? -ne 0 ];then #判断前面的java程序是否成功执行warn "需要报警的提示消息"
fi
rm -f tmp.lock #本次成功执行将tmp.lock文件删除
/
将bin和lib目录一起打包后上传到服务器,因于我是在windows下编译脚本的,所以文本换号符是\r\n,而linux的换行符是\n,mac换行符为\r,所以需要转换下。
用vi 命令打开脚本文件,通过:set ff=?来查看文件格式是unix(linux环境下)类型还是dos(windows环境下)类型,若是dos,则用命令set ff=unix做下转换。
用vi命令打开脚本后,通过:set fileencode命令可以查看文本编码方式。
3.对testshell.sh增加执行权限后就可以运行该脚本去启动java程序了,如进入testshell.sh目录执行以下命令:
chmod +x testshell.sh #增加执行权限
./testshell.sh #运行脚本文件
运行后可以该目录下看到一个out文件,里面是工程运行时日志输出内容,同时若程序非正常退出会有一个tmp.lock文件,若正常退出,则tmp.lock文件在程序运行完后就被删除了。
至此一个简单脚本发布java工程的步骤介绍完毕。若想定时启动该java工程则只需定时调用该脚本就可以达到目的了。
下面对上述脚本中用到的知识点给予解释:1.$n的含义:
$1 表示第一个参数,$2 表示第二个参数 …
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以”参数1 参数2 … ” 形式保存所有参数
$@ 以”参数1″ “参数2″ … 形式保存所有参数
$ 本程序的(进程ID号)PID
$! 上一个命令的PID
2.locale
Locale是linux系统中多语言环境的设置接口,Locale根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1)、语言符号及其分类(LC_CTYPE)
2)、数字(LC_NUMERIC)
3)、比较和排序习惯(LC_COLLATE)
4)、时间显示格式(LC_TIME)
5)、货币单位(LC_MONETARY)
6)、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7)、姓名书写方式(LC_NAME)
8)、地址书写方式(LC_ADDRESS)
9)、电话号码书写方式(LC_TELEPHONE)
10)、度量衡表达方式 (LC_MEASUREMENT)
11)、默认纸张尺寸大小(LC_PAPER)
12)、对locale自身包含信息的概述(LC_IDENTIFICATION)。
在linux下执行locale命令可以看到相关信息:
>locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
设定locale就是设定12大类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL > LC_* >LANG。可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
3.java环境变量
1). PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
2). CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
3). JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。