实战:Maven构建工具实践-2023.6.21(测试成功)

目录

推荐文章
https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》

实验环境
gitlab/gitlab-ce:15.0.3-ce.0
jenkins/jenkins:2.346.3-2-lts-jdk11
apache-maven-3.9.2
openjdk 11.0.18
实验软件
链接:https://pan.baidu.com/s/1adCJwX8-XtMBbmneNUf2og?pwd=0820
提取码:0820
–来自百度网盘超级会员V7的分享
2023.6.21-实战:Maven构建工具实践-(测试成功)

1、Maven构建工具配置
官网:https://maven.apache.org/index.html
Maven是一个项目的构建依赖管理工具。通常项目的根目录会存在一个pom.xml文件(该文件用于定义项目的依赖包信息和构建配置)

1.spring boot项目生成
初始化一个springboot项目 https://start.spring.io/ (也可以下载一个ide)
如果打不开也可以使用:https://start.aliyun.com/bootstrap.html
一个spring boot项目其实有很多依赖。
生成一个标准的maven项目:
- 项目类型: Maven Project
- 语言: Java
- SpringBoot: 2.7.12 (版本)(随着时间变化版本号会变,默认即可)
- Metadata
- Group : 组信息
- Artifact:包名称
- Packging: 包格式(Jar、War)
- Dependencies: 定义项目依赖(最后都会写入Pom.xml)
jar包:可执行的程序。(目前基本是这种)
war包:需要放到容器里,例如tomcat里,需要支持jsp环境的那种,才可以解析。

以上配置完成后,点击Generate,生成测试代码。

代码下载完成 后,可以用vscode打开,看下项目代码结构:

2.创建gitlab仓库并上传代码
- 创建一个
devops6-maven-service项目
注意:这里取消勾选初始化仓库配置项。

- 在本地git端将项目代码上传到刚才创建的项目里:

Push an existing folder
cd existing_folder
git init --initial-branch=main
git remote add origin http://172.29.9.101:8076/devops6/devops6-maven-service.git
git add .
git commit -m "Initial commit"
git push -u origin main
自己推送过程:
git init --initial-branch=main
git remote add origin http://172.29.9.101:8076/devops6/devops6-maven-service.git
git add .
git commit -m "Initial commit"
git push -u origin main


- 到gitlab查看推送上来的代码:

3.配置maven环境
提前安装好JDK, 然后安装apache-maven-3.9.1。
本次在gitlanci-runner上下载maven:(后面的环境为gitlab runner和jenkins agent都在一台机器上)
1、JDK环境自己之前已经安装好。

如何安装JDK环境,请查看我的另一篇文章!
本地文档路径:实战:Linux下jdk8环境安装(测试成功)-2022.4.16(二进制方式) (jdk11安装方式一样)

网络文档路径:https://blog.csdn.net/weixin_39246554/article/details/124221560

2、安装apache-maven-3.9.1

###1、下载代码
[root@Devops6 ~]#wget https://dlcdn.apache.org/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz --no-check-certificate
[root@Devops6 ~]#ll -h apache-maven-3.9.2-bin.tar.gz
-rw-r--r-- 1 root root 8.9M May 8 17:12 apache-maven-3.9.2-bin.tar.gz
[root@Devops6 ~]#tar zxf apache-maven-3.9.2-bin.tar.gz -C /usr/local/
[root@Devops6 ~]#cd /usr/local/apache-maven-3.9.2/
[root@Devops6 apache-maven-3.9.2]#pwd /usr/local/apache-maven-3.9.2
/usr/local/apache-maven-3.9.2
###2、配置环境
[root@Devops6 ~]#vim /etc/profile
……
export M2_HOME=/usr/local/apache-maven-3.9.2
export PATH=$M2_HOME/bin:$PATH
[root@Devops6 ~]#source /etc/profile
###3、验证
[root@Devops6 ~]#mvn -v
Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)
Maven home: /usr/local/apache-maven-3.9.2
Java version: 11.0.18, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
4.配置Maven镜像源
Maven本地仓库 & 远程仓库
[root@Devops6 conf]#vim /usr/local/apache-maven-3.9.2/conf/settings.xml
- 本地仓库
${user.home}/.m2/repository

- 远程仓库

- 自己内网一般是会去搭建这样一个代理的。
内网搭建一个这样的源,使用nexus去搭建的。


- 阿里云云效 Maven
https://developer.aliyun.com/mvn/guide?spm=a2c6h.13651104.mirror-free-trial.5.10596e1ab2zbI4


- 修改maven源为国内阿里源
https://developer.aliyun.com/mirror/maven?spm=a2c6h.13651102.0.0.3e221b11J7CO0d
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>


5.手动测试代码
- 下载代码
[root@Devops6 ~]#cd /data/devops6/
[root@Devops6 devops6]#ls
gitlab jenkins_agent jenkins_home
[root@Devops6 devops6]#git clone http://172.29.9.101:8076/devops6/devops6-maven-service.git
Cloning into 'devops6-maven-service'...
Username for 'http://172.29.9.101:8076': root
Password for 'http://root@172.29.9.101:8076':
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 25 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (25/25), done.
[root@Devops6 devops6]#ls
devops6-maven-service gitlab jenkins_agent jenkins_home
[root@Devops6 devops6]#cd devops6-maven-service/
[root@Devops6 devops6-maven-service]#ls
mvnw mvnw.cmd pom.xml src
[root@Devops6 devops6-maven-service]#
- 打包
[root@Devops6 devops6-maven-service]#pwd
/data/devops6/devops6-maven-service
[root@Devops6 devops6-maven-service]#ls
mvnw mvnw.cmd pom.xml src
[root@Devops6 devops6-maven-service]#mvn clean package


- 打包完成后,我们来启动项目
[root@Devops6 devops6-maven-service]#ls
mvnw mvnw.cmd pom.xml src target
[root@Devops6 devops6-maven-service]#cd target/
[root@Devops6 target]#ls
classes demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar.original generated-sources generated-test-sources maven-archiver maven-status surefire-reports test-classes
[root@Devops6 target]#java -jar demo-0.0.1-SNAPSHOT.jar

可以看到报错了,提示8080端口被占用了,我们来检查下:

可以看到8080端口被jenkins使用了。
- 通过自定义端口参数来启动项目
[root@Devops6 target]#java -jar -Dserver.port=8090 demo-0.0.1-SNAPSHOT.jar

通过http://172.29.9.101:8090/访问:

出现这个界面就说明ok了。(这里出现这个界面是因为代码里没有配置相关异常的代码,不影响测试。)
- 我们接着来看下maven的缓存

我们删除下这个缓存目录:
[root@Devops6 ~]#rm -rf .m2/repository/
在到项目里清下构建目录:
mvn clean



可以看到,target目录也被清理掉了。
然后打包,就可以看到要继续下载依赖包了:
mnv clean package


2、Jenkins与Maven集成


1.创建GitLab仓库
见上部分2.创建gitlab仓库并上传代码内容。
2.创建Jenkins作业
- Jenkins上创建
devops6-maven-servicepipeline类型作业,点击保存。

- 如何做一个静态构建?
添加2个选项参数:


保存后刷新:

- 开始写pipeline代码
我们先简单写一段代码,测试流水线可用性。
pipeline {
agent {label "build"}
stages{
stage("CheckOut"){
steps{
script{
println("CheckOut")
}
}
}
stage("Build"){
steps{
script{
println("Build")
}
}
}
}
}


以上测试ok。
3.编写Jenkins Pipeline
- 写下载代码逻辑
如何获取下载代码此部分代码呢?我们使用片段生成器来生成下载部分代码。


checkout([$class: 'GitSCM', branches: [[name: 'main']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-root', url: 'srcUrl']]])
pipeline {
agent {label "build"}
stages{
stage("CheckOut"){
steps{
script{
println("CheckOut")
checkout([$class: 'GitSCM',
branches: [[name: "${env.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: 'gitlab-root', url: "${env.srcUrl}"]]])
sh "ls -l" //验证
}
}
}
stage("Build"){
steps{
script{
println("Build")
}
}
}
}
}



以上下载部分代码测试ok。
- 开始写
build部分代码
pipeline {
agent {label "build"}
stages{
stage("CheckOut"){
steps{
script{
println("CheckOut")
checkout([$class: 'GitSCM',
branches: [[name: "${env.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: 'gitlab-root', url: "${env.srcUrl}"]]])
sh "ls -l" //验证
}
}
}
stage("Build"){
steps{
script{
println("Build")
sh "mvn clean package"
}
}
}
}
}



这里会发现,build阶段报错了,提示mvn命令找不到。
那我们给使用mvn命令的绝对路径来再次测试下:
[root@Devops6 ~]#which mvn
/usr/local/apache-maven-3.9.2/bin/mvn
pipeline {
agent {label "build"}
stages{
stage("CheckOut"){
steps{
script{
println("CheckOut")
checkout([$class: 'GitSCM',
branches: [[name: "${env.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: 'gitlab-root', url: "${env.srcUrl}"]]])
sh "ls -l" //验证
}
}
}
stage("Build"){
steps{
script{
println("Build")
sh "/usr/local/apache-maven-3.9.2/bin/mvn clean package"
}
}
}
}
}

再次运行:


这次就测试ok了。我们有缓存了,所以它构建非常快。
- 但是,现在有个问题:
企业里,能直接这么用吗?–构建命令写死。—显示是不合理的。
因此,我们这里使用变量来优化下代码。
在此流水线新增一个字符类型变量:

再改下pipeline代码:
pipeline {
agent {label "build"}
stages{
stage("CheckOut"){
steps{
script{
println("CheckOut")
checkout([$class: 'GitSCM',
branches: [[name: "${env.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: 'gitlab-root', url: "${env.srcUrl}"]]])
sh "ls -l" //验证
}
}
}
stage("Build"){
steps{
script{
println("Build")
sh "${env.buildShell}"
}
}
}
}
}

再次运行测试:

测试ok。
FAQ
maven常用命令
- mvn clean 清理构建目录
- mvn clean package 打包
- mvn clean install 打包部署
- mvn clean test 单元测试
- mvn clean package -f …/pom.xml -f指定pom位置\
- mvn clean package -DskipTests / -Dmaven.test.skip=true 跳过单测
- mvn deploy 发布包到制品库
Maven vs Gradle
后端:
目前Java用的最多的就是Maven了;
Gradle的性能比Maven是要强一些;(有时候,安卓打包也会用到这个Gradle)
现在基本很少用Ant了,新项目用的是Gradle;
前端:
nodeJs工具:react,vue
maven的缓存目录
在调流水线的时候,遇到很多Maven构建失败的问题。大家都去找Jenkins的问题,但最后发现是Maven这个工具出现了一些问题(使用时可能参数调错了)。Maven在构建代码的时候,经常会出现构建失败,编译不通过现象。Maven跑测试的时候也可能会报错。这个和你的项目也可能有关系,比如你项目的类找不到了,那可能也会报错了。也就是说,后续在排错时,不仅要考虑工具问题,也要考虑代码本身层面的因素。
也可以使用阿里云这种方式生成spring boot项目
-
打开链接:
如果打不开也可以使用:https://start.aliyun.com/bootstrap.html

-
按如下进行配置:

选择一个spring web组件,再添加一个spring mvc示例:


-
配置完成后,下载代码:

项目pom.xml和maven里settings.xml之间的关系
注意:这里容易混淆的一点是:
1.项目的根目录会存在一个pom.xml文件:(该文件用于定义项目的依赖包信息和构建配置);
2.maven软件包里的settings.xml:是管理maven的;(后期会该改个配置文件)
- 项目pom.xml

- maven里settings.xml

关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 语雀
https://www.yuque.com/xyy-onlyone

🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎
https://www.zhihu.com/people/foryouone

最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!
















