自动构建的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。
目前使用的是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位置 %}
至此完毕!
参考链接: