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

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

image-20230619122656768

目录

image-20230621070919176

推荐文章

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

image-20230619080407452

实验环境

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构建工具实践-(测试成功)

image-20230621070554358

1、Maven构建工具配置

官网:https://maven.apache.org/index.html

Maven是一个项目的构建依赖管理工具。通常项目的根目录会存在一个pom.xml文件(该文件用于定义项目的依赖包信息和构建配置)

image-20230619202228669

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环境的那种,才可以解析。

image-20230620065455170

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

image-20230619210108004

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

image-20230620070244314

2.创建gitlab仓库并上传代码

  • 创建一个devops6-maven-service项目

注意:这里取消勾选初始化仓库配置项。

image-20230619210635722

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

image-20230619210715469

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

image-20230619211445730

image-20230619211458878

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

image-20230619211540297

3.配置maven环境

提前安装好JDK, 然后安装apache-maven-3.9.1。

本次在gitlanci-runner上下载maven:(后面的环境为gitlab runner和jenkins agent都在一台机器上)

1、JDK环境自己之前已经安装好。

image-20230619213016203

如何安装JDK环境,请查看我的另一篇文章!

本地文档路径:实战:Linux下jdk8环境安装(测试成功)-2022.4.16(二进制方式) (jdk11安装方式一样)

image-20230619214431567

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

2、安装apache-maven-3.9.1

image-20230619214615558

###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

image-20230620062542268

  • 远程仓库

image-20230620062822608

  • 自己内网一般是会去搭建这样一个代理的

内网搭建一个这样的源,使用nexus去搭建的。

image-20230620063011707

image-20230620063048276

  • 阿里云云效 Maven

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

image-20230620063623923

image-20230620063745863

  • 修改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>

image-20230620063241219

image-20230620063349700

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

image-20230620070519530

image-20230620070831955

  • 打包完成后,我们来启动项目
[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

image-20230620071003201

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

image-20230620071124194

可以看到8080端口被jenkins使用了。

  • 通过自定义端口参数来启动项目
[root@Devops6 target]#java  -jar -Dserver.port=8090  demo-0.0.1-SNAPSHOT.jar

image-20230620071329698

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

image-20230620071410569

出现这个界面就说明ok了。(这里出现这个界面是因为代码里没有配置相关异常的代码,不影响测试。)

  • 我们接着来看下maven的缓存

image-20230620071644777

我们删除下这个缓存目录:

[root@Devops6 ~]#rm -rf .m2/repository/

在到项目里清下构建目录:

mvn clean

image-20230620072015818

image-20230620072035145

image-20230620072110832

可以看到,target目录也被清理掉了

然后打包,就可以看到要继续下载依赖包了:

mnv clean package

image-20230620072250669

image-20230620072437095

2、Jenkins与Maven集成

image-20230621065334471

tstmp_20230621065349

1.创建GitLab仓库

见上部分2.创建gitlab仓库并上传代码内容。

2.创建Jenkins作业

  • Jenkins上创建devops6-maven-servicepipeline类型作业,点击保存。

image-20230620080343274

  • 如何做一个静态构建?

添加2个选项参数:

image-20230620080552250

image-20230620080702740

保存后刷新:

image-20230621062046016

  • 开始写pipeline代码

我们先简单写一段代码,测试流水线可用性。

pipeline {
    agent {label "build"}
    stages{
        stage("CheckOut"){
            steps{
                script{
                    println("CheckOut")
                }
            }

        }

        stage("Build"){
            steps{
                script{
                    println("Build")
                }
            }

        }        
        
    }
}

image-20230621063010946

image-20230621062928614

以上测试ok。

3.编写Jenkins Pipeline

  • 写下载代码逻辑

如何获取下载代码此部分代码呢?我们使用片段生成器来生成下载部分代码。

image-20230621063253802

image-20230621063313647

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")
                }
            }

        }        
        
    }
}

image-20230621063842676

image-20230621063754348

image-20230621063818973

以上下载部分代码测试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"
                }
            }

        }        
        
    }
}

image-20230621064225132

image-20230621064206186

image-20230621064250571

这里会发现,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"
                }
            }

        }        
        
    }
}

image-20230621064452186

再次运行:

image-20230621064536597

image-20230621064551096

这次就测试ok了。我们有缓存了,所以它构建非常快。

  • 但是,现在有个问题:

企业里,能直接这么用吗?–构建命令写死。—显示是不合理的。

因此,我们这里使用变量来优化下代码。

在此流水线新增一个字符类型变量:

image-20230621064834754

再改下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}"
                }
            }

        }        
        
    }
}

image-20230621065105119

再次运行测试:

image-20230621065145744

测试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

image-20230619210317024

  • maven里settings.xml

image-20230620061734776

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

image-20230107215114763

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

image-20230107215126971

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230515221819681

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

image-20230107215149885

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

image-20230107215203185

最后

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值