自动构建的Jenkins利用push over ssh 插件,将生成好的war包,远程发布到服务器中,并且利用bin/startup.sh启动Tomcat,发现Tomcat启动了(6-7s),正常加载项目后是需要10s左右的启动时间,但是项目却没有成功。

启动失败时候的Tomcat信息:


[samp@tset-flow2 ~]$ ps -ef|grep 19011
samp     22930     1  7 09:53 ?        00:00:14 /usr/bin/java -Djava.util.logging.config.file=/u01/samp/soft/apache/tomcats/tomcat-balance-19011/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx2048m -Djava.endorsed.dirs=/u01/samp/soft/apache/tomcats/tomcat-balance-19011/endorsed -classpath /u01/samp/soft/apache/tomcats/tomcat-balance-19011/bin/bootstrap.jar:/u01/samp/soft/apache/tomcats/tomcat-balance-19011/bin/tomcat-juli.jar -Dcatalina.base=/u01/samp/soft/apache/tomcats/tomcat-balance-19011 -Dcatalina.home=/u01/samp/soft/apache/tomcats/tomcat-balance-19011 -Djava.io.tmpdir=/u01/samp/soft/apache/tomcats/tomcat-balance-19011/temp org.apache.catalina.startup.Bootstrap start
samp     23041 16786  0 09:56 pts/0    00:00:00 grep 19011

做了以下验证步骤:

  • ssh进入tomcat的bin目录下手动重启Tomcat --> 原来项目A(jdk1.8)可以正常启动。 【排除shell脚本问题
  • 替换B项目(jdk1.7)到webapps目录下,Jenkins启动 --> 项目可以正常启动。 【排除tomcat配置问题

排除了shell脚本、tomcat配置问题,那估计就是环境问题了?

Tomcat没有报错,但是项目却启动不起来,于是根据启动的信息,检查一下jdk版本

[samp@tset-flow2 ~]$ /usr/bin/java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

发现失败时候,tomcat加载的jdk是1.7版本的。

手动启动成功的tomcat信息

[samp@tset-flow2 bin]$ ps -ef|grep 19011
samp     23083     1 43 09:57 pts/0    00:00:43 /opt/java/bin/java -Djava.util.logging.config.file=/u01/samp/soft/apache/tomcats/tomcat-balance-19011/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx2048m -Djava.endorsed.dirs=/u01/samp/soft/apache/tomcats/tomcat-balance-19011/endorsed -classpath /u01/samp/soft/apache/tomcats/tomcat-balance-19011/bin/bootstrap.jar:/u01/samp/soft/apache/tomcats/tomcat-balance-19011/bin/tomcat-juli.jar -Dcatalina.base=/u01/samp/soft/apache/tomcats/tomcat-balance-19011 -Dcatalina.home=/u01/samp/soft/apache/tomcats/tomcat-balance-19011 -Djava.io.tmpdir=/u01/samp/soft/apache/tomcats/tomcat-balance-19011/temp org.apache.catalina.startup.Bootstrap start

Tomcat+项目成功启动。根据启动的信息,检查一下jdk版本

[samp@tset-flow2 bin]$ /opt/java/bin/java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

上下文对比,发现Jenkins启动的tomcat 和 ssh启动的tomcat加载的jdk不一样。

启动方式 加载jdk 路径
Jenkins java version "1.7.0_45" /usr/bin/java -version
ssh java version "1.8.0_45" /opt/java/bin/java -version

难道Jenkins启动和tomcat启动加载的jdk环境变量不一致?

是的!

Linux 登陆shell,交互shell以及环境变量读取顺序


验证一下想法:

直接指定Tomcat启动jdk版本,因为原项目A(jdk1.8)是需要启动jdk1.8的,而Jenkins是启动的jdk是默认的1.7。

Linux jdk安装多个版本并进行切换

目前使用的是1.7的jdk,估计Jenkins读取的是这里的配置:

[samp@tset-flow2 bin]$ alternatives --config java

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   3           /usr/lib/jvm/jre-1.5.0-gcj/bin/java

而ssh读取的是全局变量的

vi  /etc/profile 
注意此文件配置的JAVA_HOME、PATH
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

解决方案

既然此Tomcat运行的项目A是依赖于JDK1.8的,那么配置tomcat的启动依赖的jdk即可

vi /u01/samp/soft/apache/tomcats/tomcat-xxxxx-19011/bin/catalina.sh
catalina.sh 文件修改位置,制定jdk1.8的路径:

添加export JAVA_HOME=/opt/java、export JRE_HOME=/opt/java

export JAVA_HOME=/opt/java
export JRE_HOME=/opt/java
JAVA_OPTS="-Xms512m -Xmx2048m"
.....略.....

{% asset_img java_home.png JAVA_HOME位置 %}
至此完毕!


参考链接:

Linux jdk安装多个版本并进行切换