Skip to content

Maven构建工具实践

Maven构建工具实践

image-20230619122656768

目录

[toc]

1、Maven构建工具配置

maven是java项目的一个构建工具。

构建工具核心的功能就是管理这些依赖。

官网:https:gitinit--initial-branch=maingitremoteaddoriginhttp:gitadd.gitcommit-m"Initial commit"gitpush-uoriginmain

自己推送过程:

image-20230619211445730

image-20230619211458878

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:[root@Devops6 ~]#wget https:[root@Devops6 ~]#ll -h apache-maven-3.9.2-bin.tar.gz-rw-r--r--1rootroot8.9MMay817:12apache-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……exportM2_HOME=/usr/local/apache-maven-3.9.2exportPATH=$M2_HOME/bin:$PATH[root@Devops6 ~]#source /etc/profile###3、验证[root@Devops6 ~]#mvn -vApacheMaven3.9.2(c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)Mavenhome:/usr/local/apache-maven-3.9.2Javaversion:11.0.18,vendor:RedHat,Inc.,runtime:/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64Defaultlocale:en_US,platformencoding:UTF-8OSname:"linux",version:"3.10.0-957.el7.x86_64",arch:"amd64",family:"unix"

4.配置Maven镜像源

==Maven本地仓库 &远程仓库==

bash
[root@Devops6 conf]#vim /usr/local/apache-maven-3.9.2/conf/settings.xml
  • 本地仓库
bash
${user.home}/.m2/repository

image-20230620062542268

  • 远程仓库

image-20230620062822608

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

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

image-20230620063011707

image-20230620063048276

  • 阿里云云效 Maven

https:<id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https:</mirror>

image-20230620063241219

image-20230620063349700

5.手动测试代码

  • 下载代码
bash
[root@Devops6 ~]#cd /data/devops6/[root@Devops6 devops6]#lsgitlabjenkins_agentjenkins_home[root@Devops6 devops6]#git clone http:Cloninginto'devops6-maven-service'...Usernamefor'http:Passwordfor'http:remote:Enumeratingobjects:25,done.remote:Countingobjects:100%(25/25),done.remote:Compressingobjects:100%(15/15),done.remote:Total25(delta 1),reused 0 (delta0),pack-reused 0Unpackingobjects:100%(25/25),done.[root@Devops6 devops6]#lsdevops6-maven-servicegitlabjenkins_agentjenkins_home[root@Devops6 devops6]#cd devops6-maven-service/[root@Devops6 devops6-maven-service]#lsmvnwmvnw.cmdpom.xmlsrc[root@Devops6 devops6-maven-service]#
  • 打包
bash
[root@Devops6 devops6-maven-service]#pwd/data/devops6/devops6-maven-service[root@Devops6 devops6-maven-service]#lsmvnwmvnw.cmdpom.xmlsrc[root@Devops6 devops6-maven-service]#mvn clean package

image-20230620070519530

image-20230620070831955

  • 打包完成后,我们来启动项目
bash
[root@Devops6 devops6-maven-service]#lsmvnwmvnw.cmdpom.xmlsrctarget[root@Devops6 devops6-maven-service]#cd target/[root@Devops6 target]#lsclassesdemo-0.0.1-SNAPSHOT.jardemo-0.0.1-SNAPSHOT.jar.originalgenerated-sourcesgenerated-test-sourcesmaven-archivermaven-statussurefire-reportstest-classes[root@Devops6 target]#java -jar demo-0.0.1-SNAPSHOT.jar

image-20230620071003201

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

image-20230620071124194

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

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

image-20230620071329698

通过http: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

groovy
checkout([$class:'GitSCM',branches:[[name:'main']],extensions:[],userRemoteConfigs:[[credentialsId:'gitlab-root',url:'srcUrl']]])
groovy
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-20230621063754348

image-20230621063818973

以上下载部分代码测试ok。

  • 开始写build部分代码
groovy
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命令的绝对路径来再次测试下:

groovy
[root@Devops6~]#which mvn/usr/local/apache-maven-3.9.2/bin/mvn
groovy
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代码:

groovy
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项目呢?

如果项目代码里包含这个pom.xml文件的话,那么很大可能这项目就是一个maven项目。

devops6 实验环境、软件

bash
gitlab/gitlab-ce:15.0.3-ce.0jenkins/jenkins:2.346.3-2-lts-jdk11apache-maven-3.9.2openjdk11.0.18

实验软件

链接:https:tarexportexportsourceant-version

常用命令:

Jenkins集成:

案例:gitlabCI &Maven集成

  • 创建.gitlabci-yml文件,编写流水线代码:
groovy
stages:-build-testvariables:GIT_CHECKOUT:"false"RUNNER_TAG:"maven"pipelineInit:stage:.pretags:-"${RUNNER_TAG}"variables:GIT_CHECKOUT:"true"script:-ls -l cibuild:tags:-"${RUNNER_TAG}"stage:buildscript:-/usr/local/apache-maven-3.8.5/bin/mvn clean packagecitest1:tags:-"${RUNNER_TAG}"stage:testscript:-/usr/local/apache-maven-3.8.5/bin/mvn test

  • 确认下runner上有maven标签:

  • 因为前面jenkins的slave节点和gitlabci-runner不是同一个节点,因此这里还需要把maven环境的源修改为阿里源,然后构建: 修改方法见jenkins构建部分:

可以看到,能够成功构建了。

  • 这边再跑一次流水线,观察下构建速度:

这次构建就没有下载包了,速度很快,这是因为使用了maven缓存: 注意:gitlabCI-runner的用户是gitlab-runner,因此缓存位置要清楚。

🍀 配置maven全局缓存:

  • 此时有必要配置下maven的全局缓存了: 1.占用磁盘空间 2.你的编译构建时间加长了 我们先创建下全局缓存配置,再把gitlab-runner用户的缓存移动到全局缓存,再观察小构建速度:
bash
[root@gitlab-runner ~]#mkdir -p /data/maven_build_cache[root@gitlab-runner ~]#mv /home/gitlab-runner/.m2/repository/*/data/maven_build_cache/[root@gitlab-runner ~]#vim /usr/local/apache-maven-3.8.5/conf/settings.xml……<localRepository>/data/maven_build_cache</localRepository>

可以看到,配置的全局缓存起作用了: 测试完成。😘

案例:Go项目构建工具

🍀 Go配置环境 见我的另外2篇文章: 1.本地路径: 实战:windows上基于vscode的golang环境搭建(博客分享-测试成功)-kk-2022.4.28 实战:centos上安装Go软件(博客分享-成功测试)-kk-2022.5.18

2.csdn路径: https:import("fmt")funcmain() {fmt.Println("hello world!")}

推送过程:

在gitlab上查看:

🍀 gitlabCI &Go集成 在gitlab上新建一个.gitlab-ci.yml文件,并编写代码,提交测试: 完整代码:

提交后观看效果: 测试结束。😘

案例:打包maven依赖包-2024.8.20(测试成功)

maven下载依赖包很耗时,我能不能先第一次下载下来,然后再吧下载好的一来压缩打包起来,放到其他机器上使用呢?

是的,你可以将 Maven 下载的依赖包(通常存放在本地 .m2目录下)打包起来,然后在其他机器上解压使用,以避免重复下载这些依赖包。这在网络环境不佳或者需要在多台机器上配置相同环境时非常有用。以下是具体步骤:

步骤一:在第一台机器上下载依赖包

  1. 执行 Maven 构建命令在需要下载依赖的项目目录下执行 Maven 命令,如:

    bash
    mvncleaninstall

    这会下载所有需要的依赖包到本地 .m2目录。

步骤二:打包 .m2目录

  1. 找到 .m2目录通常在 Unix 系统下为 ~/.m2,在 Windows 系统下为 %USERPROFILE%\.m2

  2. 打包 .m2目录使用 tarzip等工具将 .m2目录打包:

    bash
    tar-czvfmaven-repo.tar.gz~/.m2/repository

    或者用 zip

    bash
    zip-rmaven-repo.zip~/.m2/repository

步骤三:在其他机器上解压 .m2目录

  1. 传输打包文件将打包好的文件传输到其他机器上,使用 scprsync或 USB 设备等。

  2. 解压打包文件在其他机器上解压 .m2目录:

    bash
    tar-xzvfmaven-repo.tar.gz-C~/

    或者用 unzip

    bash
    unzipmaven-repo.zip-d~/

步骤四:验证依赖包是否可用

  1. 执行 Maven 构建命令在其他机器上验证是否可以直接使用这些依赖包:

    bash
    mvncleaninstall

    这时候,Maven 应该会直接从本地 .m2目录中获取依赖包,而不是从远程仓库下载。

==本次输出==

bash
cd~tar-xzvfmaven-repo.tar.gzmvroot/.m2~

自动化方法:使用 Nexus 或 Artifactory

如果你需要在多个项目和团队中重复使用依赖包,建议使用 Maven 私有仓库,如 Nexus 或 Artifactory,这样可以更有效地管理和共享依赖包。

总结

通过将 .m2目录打包并在其他机器上解压,你可以避免在多台机器上重复下载 Maven 依赖包,从而节省时间和带宽。这种方法特别适用于网络环境不佳的情况或者你需要快速配置多个开发环境。

关于我

我的博客主旨:

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

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

image-20230107215114763

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

image-20230107215126971

🍀 语雀

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新