本篇文章给大家介绍涉及Maven的项目编译,Maven是一个项目管理和综合工具,提供给开发人员一个完整的生命周期框架,开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。它是Apache的一个开源项目,主要服务于JAVA平台的构建,依赖管理,项目管理。
1、在官网或者镜像源下载Maven 3的安装包
官网:http://maven.apache.org/download.cgi
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/
2、安装Maven
下面版本的下载连接放到文末。
[root@Jenkins ~]# tar xf apache-maven-3.3.9-bin.tar.gz
[root@Jenkins ~]# mv apache-maven-3.3.9 /usr/local/
[root@Jenkins ~]# ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
[root@Jenkins ~]# /usr/local/maven/bin/mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_181-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
3、编辑/etc/profile文件,在末尾添加PATH变量
[root@Jenkins ~]# cat /etc/profile
...
export PATH=/usr/local/apache-maven-3.3.9/bin/:$PATH
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/apache-maven-3.3.9
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_181-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
mvn -v 查看版本号
validate(验证): 验证项目正确,并且所有必要信息可用。
compile(编译): 编译项目源码
test(测试): 使用合适的单元测试框架测试编译后的源码。
package(打包): 源码编译之后,使用合适的格式(例如JAR格式)对编译后的源码进行打包。
integration-test(集成测试): 如果有需要,把包处理并部署到可以运行集成测试的环境中去。
verify(验证): 进行各种测试来验证包是否有效并且符合质量标准。
install(安装): 把包安装到本地仓库,使该包可以作为其他本地项目的依赖。
deploy(部署): 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
mvn clean (清除) : 清除上次编译的结果
mvn package -Dmaven.test.skip=true 跳过测试用例
mvn package #会去maven的中央仓库去下载需要的依赖包和插件到.m2目录下
需求:上传一个简单的Java项目包hello-world.tar.gz进行解压,解压后,将代码推送到gitlab远程仓库,通过触发器触发Jenkins事件,Jenkins拉取代码到Jenkins服务器,用Maven执行打包命令。(项目包下载连接放到文末)
1、上传代码到gitlab
Project Object Model是项目对象模型,通过xml格式保存的pom.xml文件,该文件用于管理源代码,配置文件,开发者的信息和角色,问题追踪系统,组织信息,项目授权,项目的url,项目的依赖关系等等,该文件是由开发维护,运维人员可以不用关心。
[root@Gitlab ~]# rz -E
rz waiting to receive.
[root@Gitlab ~]# tar xf hello-world-war.tar.gz
[root@Gitlab ~]# cd hello-world-war/
[root@Gitlab hello-world-war]# ls
dist pom.xml README.md src
[root@Gitlab hello-world-war]# git remote # 查看与远程仓库的连接
origin
[root@Gitlab hello-world-war]# git remote remove origin # 删除默认连接
[root@Gitlab hello-world-war]# git remote
[root@Gitlab hello-world-war]#
2、我们在gitlab创建一个新的项目,将代码提交至此处
[root@Gitlab hello-world-war]# git remote add origin [email protected]:root/java.git
[root@Gitlab hello-world-war]# git remote -v
origin [email protected]:root/java.git (fetch)
origin [email protected]:root/java.git (push)
[root@Gitlab hello-world-war]# git push -u origin master
Counting objects: 37, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (37/37), 4.48 KiB | 0 bytes/s, done.
Total 37 (delta 8), reused 0 (delta 0)
To [email protected]:root/java.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
4、刷新gitlab的web界面,显示项目代码文件,再次复制项目地址
5、在Jenkins中新建一个maven项目,去拉取gitlab代码
该项目相较于自由风格项目多了一个编译过程
对该项目做一些配置
添加源码源
在build处可以看到有报错信息,显示需要配置maven的一些东西,点击蓝色位置,右键打开新的标签页
在新的标签页下滑添加一下Maven的家目录
此时我们的build处仍然显示报错,原因是没有刷新,没关系,我们填写Goals and options的内容,clean package 先清除再打包。
退出再次进入就不显示报错了
先手动跑通项目部署,在Jenkins上手动上传项目,将项目通过Maven打包后,将代码部署到web服务器。
1、手动上传项目到Jenkins服务端
[root@Jenkins ~]# cd hello-world-war/
[root@Jenkins hello-world-war]# ls
dist pom.xml README.md src
[root@Jenkins hello-world-war]# mvn package # 打包项目
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 04:41 min
[INFO] Finished at: 2023-08-20T18:18:48+08:00
[INFO] Final Memory: 14M/261M
[INFO] ------------------------------------------------------------------------
2、将打包好的war包推送到web端指定位置
打包项目成功后,发现多了target目录,目录下面有hello-world-war-1.0.0.war(如果是执行clean会清除target目录)
[root@Jenkins hello-world-war]# ls
dist pom.xml README.md src target
[root@Jenkins hello-world-war]# ls target/
hello-world-war-1.0.0 maven-archiver
hello-world-war-1.0.0.war
3、推送war包至web服务器的tomcat代码目录
[root@Web01 ~]# ls /soft/tomcat/webapps/ROOT/
asf-logo-wide.svg bg-nav.png index.jsp tomcat.svg
bg-button.png bg-upper.png RELEASE-NOTES.txt WEB-INF
bg-middle.png favicon.ico tomcat.css
[root@Web01 ~]# rm -rf /soft/tomcat/webapps/ROOT/*
[root@Jenkins hello-world-war]# scp target/hello-world-war-1.0.0.war 10.0.0.7:/soft/tomcat/webapps/ROOT/
hello-world-war-1.0.0.war 100% 2402 1.3MB/s 00:00
[root@Web01 ~]# ls /soft/tomcat/webapps/ROOT/
hello-world-war-1.0.0.war
[root@Web01 ~]# cd /soft/tomcat/webapps/ROOT/
[root@Web01 ROOT]# unzip hello-world-war-1.0.0.war
Archive: hello-world-war-1.0.0.war
creating: META-INF/
inflating: META-INF/MANIFEST.MF
creating: WEB-INF/
creating: WEB-INF/classes/
inflating: WEB-INF/web.xml
inflating: index.jsp
creating: META-INF/maven/
creating: META-INF/maven/com.efsavage/
creating: META-INF/maven/com.efsavage/hello-world-war/
inflating: META-INF/maven/com.efsavage/hello-world-war/pom.xml
inflating: META-INF/maven/com.efsavage/hello-world-war/pom.properties
[root@Web01 ROOT]# ls
hello-world-war-1.0.0.war index.jsp META-INF WEB-INF
4、浏览器访问10.0.0.7:8080,成功显示了界面
编写构建步骤,实现提交代码到gitlab,自动触发Jenkins事件,Jenkins通过Maven打包后,将代码部署到web服务器。
我们上面创建了Jenkins的项目,还没有写构建步骤,只是写了clean和package,此时我们点击立即构建,会生成出target的目录,也就是说执行了从gitlab拉取代码再在Jenkins上执行的maven编译过程。
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/
freestyle-job git_version java-job
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/java-job/
dist pom.xml README.md src target
但是这样还不够,我们构建项目要实现的是自动部署到web服务器上,所以我们增加构建步骤。
1、增加构建步骤
此处可以选择直接把代码写在里面,也可以选择把这些代码放到脚本里面,在此处只写一个执行脚本即可。
ssh 10.0.0.7 "cd /soft/apache-tomcat-9.0.73/webapps/ && mkdir java_$BUILD_ID"
scp target/*.war 10.0.0.7:/soft/apache-tomcat-9.0.73/webapps/java_$BUILD_ID
ssh 10.0.0.7 "cd /soft/apache-tomcat-9.0.73/webapps/java_$BUILD_ID && unzip *.war && rm -rf *.war"
ssh 10.0.0.7 "cd /soft/apache-tomcat-9.0.73/webapps/ && rm -rf ROOT && ln -s java_$BUILD_ID ROOT"
ssh 10.0.0.7 "/soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh"
[root@Web01 webapps]# ll
total 4
drwxr-x--- 16 root root 4096 Aug 20 19:18 docs
drwxr-x--- 7 root root 99 Aug 20 19:18 examples
drwxr-x--- 6 root root 79 Aug 20 19:18 host-manager
drwxr-xr-x 2 root root 39 Aug 20 19:34 java_2
drwxr-xr-x 4 root root 54 Aug 20 19:37 java_3
drwxr-x--- 6 root root 114 Aug 20 19:18 manager
lrwxrwxrwx 1 root root 6 Aug 20 19:37 ROOT -> java_3
[root@Web01 webapps]# ls ROOT/
index.jsp META-INF WEB-INF
浏览器访问也可以成功访问,此时我们注意是v4.0
复制钩子地址
将钩子的URL和生成的token,复制到gitlab的项目的设置下的集成页面,点击增加Web钩子
4、在gitlab修改代码,提交到Jenkins进行测试
[root@Gitlab hello-world-war]# cat src/main/webapp/index.jsp
Hello World!
Hello World! v5.0
It is now
<%= new java.util.Date() %>
You are coming from
<%= request.getRemoteAddr() %>
[root@Gitlab hello-world-war]# git commit -am "v2.0"
[master 8541df7] v2.0
1 file changed, 1 insertion(+), 1 deletion(-)
[root@Gitlab hello-world-war]# git push -u origin master
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 433 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To [email protected]:root/java.git
b0b92ed..8541df7 master -> master
Branch master set up to track remote branch master from origin.
自动触发Jenkins事件,Jenkins完成使用Maven编译代码,推送到Web服务器的操作,此时我们刷新浏览器,发现版本已经发生了变化。
Maven安装包下载链接:https://pan.baidu.com/s/1HPUaEHzaqLV4fk9VvySAew?pwd=im0w
Java项目包下载链接:https://pan.baidu.com/s/1Poll1N7R1O2jz7_RRkAjXg?pwd=wja5
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!