在本篇文章中我将详细介绍下在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下是;

#为了避免当程序由于没有正常执行而退出,然而用户却多次执行该脚本启动程序导致有多个进程的情况,这里可以用一个变量(如我采用在程序启动时判定一个文件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。