自从开始做项目的两周多以来,可谓是每天多活在忙碌的日子里。因为各方面的技术还不能达到要求,不够成熟,很多技术还停留在理论阶段,所以采取了“边学边写边改”的开发模式,两周的时间,学到了很多在走阶段过程中学习不到的知识。
上周末的时候已经将后端的接口写完,实现了项目后端的基本需求。因为采用的是前后端分离的方式,所以在部署项目的时候发现,我们平时将JavaEE项目开发完后,需要将项目部署到服务器的tomcat上。常用的部署方式是将项目打包成war包放到tomcat的webapps下,然后重启tomcat,然后通过ip地址+端口号访问。这样部署本身是没问题的,但问题在于,如果还是在生产环境下的话,需要频繁的更改优化项目,那么就需要频繁的将项目打war包,替换webapps下的war包,操作繁琐。如果频繁修改的话,会大大降低开发的效率。
刚好上次和一位Java后端开发工程师进行交流时,讨论了下这个问题,得知热部署和持续集成两种方式都可以解决眼下的需求。所以就去了解和学习了tomcat+maven实现热部署和使用jenkins持续集成两项技术,自动编译项目并部署到远程的服务器。
但是在学习和使用过程当中,真真切切遇到了很多的问题,不只是配置和使用上的问题,还有很多以前在学习ssm时遗留的IDEA、maven,以及云服务器linux等等问题。tomcat热部署还好一些,虽然也遇到了一些坑,但是很快也都解决了。但是以前遗留的一个maven打包时,resources文件夹下配置文件不能打包到classes下,导师jar包或者war包中没有配置文件而导致报错。以前在学习ssm的时候也遇到这个问题了,当时找到的解决办法是在idea的build时配置resources的打包路径,可以解决这个问题,但是每次更改resources下文件的时候都需要重新rebuild这个项目。虽然当时解决了这个问题,但是。。。。。
在学习使用jenkins持续集成的时候,遇到了两个比较恶心的问题。一个是自己写的tomcat重启的脚本,总是会在jenkins中报错;花费了好久的时间才解决。明明是别人测试可以成功的,但是到我这里就是不行
百度别人的代码——tomcat重启脚本
#! /bin/bash
tomcat_home=/usr/local/tomcat-8
SHUTDOWN=$tomcat_home/bin/shutdown.sh
STARTTOMCAT=$tomcat_home/bin/startup.sh
echo "关闭$tomcat_home"
$SHUTDOWN
#杀死tomcat进程
ps -ef|grep $path|grep java|awk '{print $2}'|xargs kill -9
#删除日志文件,如果你不先删除可以不要下面一行
rm $tomcat_home/logs/* -rf
#删除tomcat的临时目录
rm $tomcat_home/work/* -rf
sleep 5
echo "启动$tomcat_home"
$STARTTOMCAT
#看启动日志
#tail -f $tomcat_home/logs/catalina.out
经过我无数次的试验和修改终于不报错了
#! /bin/bash
export LANG=zh_CN.UTF-8
export JAVA_HOME=/usr/local/jdk8
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$CATALINA_BASE/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
tomcat_home=/usr/local/tomcat8.5
SHUTDOWN=$tomcat_home/bin/shutdown.sh
STARTTOMCAT=$tomcat_home/bin/startup.sh
echo "关闭$tomcat_home"
$SHUTDOWN
#杀死tomcat进程
ps -ef|grep $path|grep java|grep -v 'grep'|awk '{print $2}'|xargs kill -9
#删除日志文件,如果你不先删除可以不要下面一行
rm $tomcat_home/logs/* -rf
#删除tomcat的临时目录
rm $tomcat_home/work/* -rf
sleep 5
echo "启动$tomcat_home"
$STARTTOMCAT
#看启动日志
#tail -f $tomcat_home/logs/catalina.out
但却也报出了我不理解的地方,总算是没有在jenkins中报错,就先这样了,先用着,之后在解决。
[root@VM_0_8_centos bin]# vim restart.sh
[1]+ Stopped vim restart.sh
[root@VM_0_8_centos bin]# ./restart.sh
关闭/usr/local/tomcat8.5
Using CATALINA_BASE: /usr/local/tomcat8.5
Using CATALINA_HOME: /usr/local/tomcat8.5
Using CATALINA_TMPDIR: /usr/local/tomcat8.5/temp
Using JRE_HOME: /usr/local/jdk8/jre
Using CLASSPATH: /usr/local/tomcat8.5/bin/bootstrap.jar:/usr/local/tomcat8.5/bin/tomcat-juli.jar
用法: grep [选项]... PATTERN [FILE]...
试用‘grep --help’来获得更多信息。
用法:
kill [选项] <pid|名称> [...]
选项:
-a, --all 不限于只对和当前进程的用户 id 相同的进程进行
名称-进程id 转换
-s, --signal <信号> 发送指定的信号
-q, --queue <信号> 使用 sigqueue(2) 代替 kill(2)
-p, --pid 打印 pid 而不向它们发送信号
-l, --list [=<信号>] 列出信号名,或将一个信号转换为名称
-L, --table 列出信号名和数值
-h, --help 显示此帮助并退出
-V, --version 输出版本信息并退出
更多信息请参阅 kill(1)。
启动/usr/local/tomcat8.5
Using CATALINA_BASE: /usr/local/tomcat8.5
Using CATALINA_HOME: /usr/local/tomcat8.5
Using CATALINA_TMPDIR: /usr/local/tomcat8.5/temp
Using JRE_HOME: /usr/local/jdk8/jre
Using CLASSPATH: /usr/local/tomcat8.5/bin/bootstrap.jar:/usr/local/tomcat8.5/bin/tomcat-juli.jar
Tomcat started.
据我初步推测,可能是因为“ps -ef|grep 2}'|xargs kill -9”的语法问题,可能进程也并没有关闭,但是但是,之后jenkins确实也可以正常部署了。。。。。
另一个问题就是上边提到的问题,在jenkins中实现自动编译部署,需要借用maven,但是上边解决那个问题是通过IDEA工具去解决的,这次使用jenkins就不能使用那种方法了。问题很明显是出在了maven的打包上,百度搜了很多的解决方法,大都是在pom文件中添加以下代码
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<!--包含文件夹以及子文件夹下所有资源-->
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
搜了很多很多,但是基本都是这个实现方法,可是我一使用,总是不能达到预期的效果,非常的难受,差点心态爆炸。最后发现问题,原来在于,我潜意识一直认为/src/mian下的资源文件是resource,所以就发生了一下这张图的悲催
在这里浪费了我半天的时间,心态爆炸,但好在总算解决了。
jenkins部署测试了43次才真正将部署到云服务器,并本地访问成功
之后解决这个问题后,项目的war包中的根目录重新显示resources的配置文件,在云服务器上运行成功。
在实际的开发当中总是会遇到奇奇怪怪的问题,但是坚持下去,采用各种方法去不断尝试,总是会成功的。过程虽然呕心沥血,但是解决问题的那一刻,也总是会由衷的nice!!!
下面分享下我的两篇关于tomcat热部署和jenkins持续集成实现项目自动化部署的博客
-
SSM项目频繁打成war包部署操作频繁?使用tomcat和maven实现热部署
https://blog.csdn.net/qq_42937522/article/details/103256180 -
jenkins持续集成实现本地项目自动化部署到服务器
后续更新。。。。