idea角度看Maven的生命周期

2021/10/01

前言

最近和朋友交流技术,发现很多人在idea右侧maven面板不清楚全部的命令意思,有些人甚至都没打开甚至没使用过clean命令,有些人不知道install命令,这让我很惊讶…所以尝试用自己认为好理解的方式做一个总结,以后可以那这个水一期组内技术分享😋

image-20210930205154357

idea右侧maven控制面板

Maven简介

maven简单来说有两件重要事

打包

java被称为是半解释语言,一方面java有一个预编译的过程,需要把.java变成.class在java虚拟机上跑,.class又在jvm上解释运行。java 提供javac来进行编译java文件,但是辣么多.java的文件总需要有工具来帮助我们统一打包。mvn可以帮我们做到,只需要maven compiler 就可以帮我们编译整个项目。

image-20210930231847300

java原生编译

导包

在写代码的时候,大部分情况你不是cmd+c和cmd+v代码就是在github上找轮子。cv代码好敲,但是你找到的轮子要整合带你的项目里面,要把jar包下载下来然后add到一个你创建的目录下,你自己去找到并且下载,还要自己管理。maven可以帮我们很好的做到,只需要一个pom文件就可以导入各种依赖包还可以做很多项目配置。

image-20210930232738343

不使用maven,最初jar包管理

最重要的是,如果你使用maven,打包和导包可以完美结合,让你可以B项目打包的时候可以导入你A项目打成的包。

依赖坐标

这里默认你原来就是用过maven,自然是知道maven的依赖坐标规则

<dependency>
    <!-- 包名,这个在本地仓库是根据这个名字来排文件夹的 -->
    <groupId>cn.hutool</groupId>
    <!-- 具体的依赖名字 -->
    <artifactId>hutool-all</artifactId>
    <!-- 版本号 -->
    <version>5.6.5</version>
</dependency>

maven所有的依赖其实都放在云端,maven官方有一个叫中央仓库的地方,默认会去那里拉取,当然你也可以设置自己的私服仓库(一般公司都会有内网的仓库),就可以配置优先从私服拉取。拉取到的包都会存放到本地,成为本地仓库。这一切都是可以设置的,包括中央仓库的镜像,私服仓库的地址,本地仓库的路径等等。

优先级是先查看本地仓库是否存在(根据groupId的路径+artifactId的名字),如果不存在再去中央仓库拉取,拉到以后就放本地仓库。

生命周期

说清楚上面以后,这些构建生命周期的命令,稍微解释解释就好啦。

命令 解释
clean 表示运行清理操作(会默认把target文件夹中的数据清理)
compile 编译,会将代码编译到target文件夹中
test 单元测试框架(例如JUnit)运行测试(一般我会禁用掉)
package 创建JAR/WAR包如在 pom.xml 中定义提及的包
install 会将打好的包安装到本地仓库中,以便其他的项目可以调用。
deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

那么其中用的比较多的,就是clean/compile/package/install,下面我用idea的maven插件来演示,当然也可以在终端中使用maven的原生命令,e.g. mvn clean

Clean

这个就是非常简单,我一般遇到无法解决的bug就会clean一下😂。其实这个就是把target文件夹都删掉了(target是maven编译后的文件聚集地),这样就可以强制重新编译,让idea吃上最新的代码。

2021-10-01 00.03.45

compile

这个和上面有点相反,上面是删除target文件夹,这个就是生成文件夹,这个命令我一般用于…检测我的代码能不能过编译,一般我代码上传到git上之前都会执行一下,防止自己提交的代码编译期都过不了。

2021-10-02 13.22.51

package

这个相信大家都常用,即便是不在本地打包使用,也会在一些CI/DI的工具上看到类似这样的maven命令mvn package -Dmaven.test.skip=true -P prod,这就是对生产环境打包。点击打包以后,首先会对当前项目进行编译,然后在把编译的代码打成一个jar包(当然在pom文件里面可以配置打成什么格式)

2021-10-02 13.25.59

install

如果你有提供给公司团队内写组件,一般会把自己的项目打成一个jar包然后让别的同事应用到他自己的项目里。或者你自己有两个项目,并且项目没有在一个工程里面,b项目引用a项目,那么本地测试调的时候应该使用install把a项目打到本地仓库进行调试。

  1. 我们先写一个demo02,指定groupId和artifactId

    image-20211002133710611

  2. 我们查看一下我们本地仓库,是否有这个cn.someget.maven的路径嵌套文件夹

    image-20211002134153588

确认没有
  1. 在另外一个工程的pom文件去通过groupId去依赖这个工程(注意不能再同一个工程,同一个工程下默认maven会检测到)

    image-20211002134505630

随便开了一个项目...可以看到报错,没有导入成功
  1. 然后我们对项目进行install,我们看一下会发生什么/如下图可以看到,这个依赖项目导入不报错了,在本地仓库也可以看到刚刚打的jar包被放在cn下的someget下的maven下的版本号下面

2021-10-02 13.46.30

后言

本来还想写一个项目到github上,国庆放假实在是太好玩了,就简单写了一下,主要想表达的就是maven项目构建声明周期的概念,除了clean外,其他周期都是会一层一层叠加的,例如我package的话,我会先complier,我install的话我会想compiler然后再package。具体大家clean一下以后,然后直接install然后看看是否有target文件夹,文件夹里面是不是有jar包,本地仓库是不是有groupId的路径来测试一下。

(转载本站文章请注明作者和出处 没有气的汽水



┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├ 文章已经完啦, 想要第一时间收到文章更新可以关注↓ ┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘

Post Directory






下面是评论区,欢迎大家留言探讨或者指出错误哈