文章目录
1.maven下载与配置
1.1 环境搭建
首先检查前置环境,先检查自己是否已经配好jdk,再做之后的安装工作。
然后去官网下载maven,网址:https://maven.apache.org/download.cgi,选择二进制zip压缩包下载并解压。
完成后,找到文件夹目录,复制它的路径。
接下来配置环境。如果使用win10系统,进入设置主页,点击“系统”。
在“关于”栏里找到“高级系统设置”。
点击“环境变量”。
在“系统遍历”里面,新建“MAVEN_HOME”。
然后找到“path”,点击“编辑”。
新建"%MAVEN_HOME%\bin",点击“确定”。
cmd检查环境是否配置成功
1.2 更改maven配置源、配置本地仓库
首先我们配置源,因为maven默认是从国外下载包,会存在网络问题,所以我们更换到国内源。
找到maven主目录conf文件夹下的setting.xml(maven的配置文件),打开。
找到“mirrors"这个标签,把下面这段代码粘贴进去。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
这样就使用阿里云的国内镜像了。
接下来配置本地仓库,也就是从镜像下载包的本地存储位置。
在任意一个地方新建一个文件夹,博主为了好找,就在maven旁新建了,取名maven-repository(当前可以不用和我一样)。
打开conf文件夹下的setting.xml,找到“localRepository”标签,加入刚才建文件夹的路径。
这样,我们就把本地仓库也配置好了,对了,还得设置maven编译的jdk,把下面这段代码加入setting.xml的“profiles”标签。
注意,更改maven配置文件,一定得记得保存!
1.3 idea全局配置maven
接下来,配置idea的全局配置,以便我们的每一个idea项目都能使用maven来构建。
博主使用的idea版本是2020.1.3,不同版本的idea对于全局的配置可能会有些许差异。
找到左上角file->New Projects Settings->Settings for New Projects,注意,这里不是去找file->settings,后者只能改变当前项目的maven配置,前者一劳永逸。
找到Settings for New Projects里面的maven设置,更改maven home directory为maven本地的下载目录,设置配置文件settings.xml存在的目录,Local repository会根据settings.xml里面的配置自动生成,点击OK保存设置。
这样,我们的maven才能算得上下载完成了。
2.依赖与插件
2.1 怎么引入依赖
我们在idea里面来new一个maven项目,使用webapp这个模板。
我们把项目命名为“show”,这里有个gav坐标的概念,GroupId表示项目所属的组织,ArtifactId表示该组织下的项目Id,Version表示项目的版本,下面引入具体包就能看到这样的命名方式。
最后配置maven,由于我们已经全局配置过了,这里就会自动的匹配到我们的maven,直接Finish。
项目创建成功,可以看到系统自动为我们生成了pom.xml配置文件,以"dependencies"为标签的表示依赖组,我们可以到官方maven库中去引入依赖,这里以mysql-connector为例,在搜索框搜索mysql-connector。
进去之后可以看到不同的版本号,一般选择使用最多的引入。
把这段代码粘贴进pom文件的"dependencies"标签下即可
粘贴完成之后不要忘了更新maven,引入相应的jar包到本地仓库。
这样,一个依赖就被引入了。
2.2 怎么引入插件
pom文件里面的“plugins”标签就是引入插件的地方,我们可以看到这里默认已经引入了很多插件,待会儿我们来使用它们,现在先来看看怎么引入,以tomcat为例,idea支持内嵌tomcat插件运行,maven官网提供了插件的引入地址。
可以看到,这里有一些核心插件和工具插件,可以发现,核心插件里的clean、compiler等我们已经引入了,在下方找到要用的tomcat。
选择最近的版本进入。
选择tomcat7插件,粘贴到pom文件的“plugins”标签中,更新即可导入tomcat插件。
2.3 插件tomcat与本地tomcat的切换与使用
插件tomcat导入完毕,怎么去使用呢?
打开启动配置,这里添加一个maven配置。
在命令行(Command line)输入tomcat7:run,表示以插件tomcat7启动项目。
点击ok回到主页面,启动项目。
初次启动可能会下载一些依赖,启动成功如下所示,点击网址就能访问了。
那么如果我们只想使用本地tomcat,又怎么去配置呢?
仍然打开启动配置,添加一个本地tomcat。
点击配置,找到本地的tomcat文件。
配置完成后,把当前项目发布到本地tomcat,点击“deployment”,再点击加号的“Artifacts”,就可以看到当前项目了,点击ok把它发布进去。
回到主页,就能使用本地启动我们的tomcat了。
3.maven常见操作命令
查看当前maven版本。
mvn --version
构建模板项目。
mvn archetype:generate
清理命令:清理项目中编译生成的文件,也就是target目录下的文件
mvn clean
编译命令:将源代码编译为字节码文件,也就是产生target目录文件
mvn compile
打包命令:打包项目,生成对应的jar包或者war包,存储到target目录中
mvn pakage
安装命令:将打包好的jar/war添加到本地仓库中,其他项目能通过这个项目的gav坐标引入使用
mvn install
发布命令:将本地仓库的jar/war发布到私有服务器,方便其他项目远程通过gav坐标使用
mvn deploy
4.自定义骨架
现在用我们的命令来构建一个骨架,添加到本地仓库,方便下次直接使用。
首先找到项目的地址。
在这个路径进行cmd,执行命令:mvn archetype:create-from-project,发现报错了。
说的是配置文件不存在,官网对这个报错给出的解决办法是:将maven的安装目录/conf目录下的setting.xml拷贝到C:\Users\young.m2目录下即可。
拷贝完成后重新执行命令,成功。
接下来,把项目骨架安装到本地仓库:mvn clean install。
安装完成后,需要添加到archetype里面,
首先,我们要知道这个项目的gav坐标,如下所示:
然后,新建一个项目,点击添加骨架,输入我们项目的gav地址,就可以添加进去了。
下次创建项目时,就可以直接用骨架,快速开发。
5.依赖传递与统一聚合管理
5.1 依赖范围管理
scope标签表示依赖作用的范围,一图了解各种范围。(注:默认范围是compile)
5.2 父子项目依赖传递
我们新建一个项目,骨架使用"quickstart",命名为"mcex01_parent",把它作为父项目,注意父项目的打包方式只能是pom。
<!-- 父项目打包方式 -->
<packaging>pom</packaging>
然后我们引入一些依赖,这里可以使用依赖的版本管理,即在properties标签使用“依赖.version”的方式,部分代码如下所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<junit.version>4.11</junit.version>
<spring.version>5.2.8.RELEASE</spring.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<!-- 父项目中的基本依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 这里和上面一样,统一使用了一个版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
接下来通过dependencyManagement标签可以设置父项目统一管理依赖,这些依赖不会导入父项目中,在子项目才会导入。
<!-- 父项目中统一管理的依赖:依赖容器,在子项目中使用的时候才会引入 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
父项目就做那么多,看看子项目怎么实现。
新建一个项目,骨架使用"quickstart",命名为"mcex01_wiki",把它作为子项目,在pom文件里实现继承。
<!-- 继承关系:继承一个项目 -->
<parent>
<artifactId>mcex01_parent</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../mcex01_parent/pom.xml</relativePath>
</parent>
<!-- 继承关系中,子项目会自动继承父项目的groupId -->
<!-- <groupId>org.example</groupId>-->
<artifactId>mcex01_wiki</artifactId>
<version>1.0-SNAPSHOT</version>
点击刷新,父项目dependencies中的依赖就被添加进来了,但dependencyManagement中的依赖还是没有添加进来,如何使用父项目依赖容器里面的依赖呢?如下所示。
<!-- 使用父项目中依赖管理器统一管理的依赖 -->
<!-- 可以不写版本号,依赖版本由父项目统一管理 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
5.3 统一聚合管理
在理解了传递依赖后,我们看一下怎么使用这种关系来统一管理项目,新建一个项目,以“quickstart”为模板,命名为"mcex02_aggregation",把它作为父项目,故pom文件要做如下调整。
<packaging>pom</packaging>
接着,我们在此项目上创建"模块",在项目上右键,new->model,以“quickstart”为模板,命名为“”mcex02_wiki"。
创建完成后,可以看到子项目pom文件默认继承了"mcex02_aggregation"。
<parent>
<artifactId>mcex02_aggregation</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mcex02_wiki</artifactId>
<name>mcex02_wiki</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
而父项目pom也多出了一块东西,表示它的子项目模块。
<modules>
<module>mcex02_wiki</module>
</modules>
这样做有什么好处呢?
当我们在对项目进行打包的时候,只需要对父项目打包,其子项目也会跟着打包。
(使用pakage命令)
[INFO] mcex02_aggregation ................................. SUCCESS [ 0.003 s]
[INFO] mcex02_wiki ........................................ SUCCESS [ 2.149 s]
[INFO] mcex02_note ........................................ SUCCESS [ 0.761 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.990 s
[INFO] Finished at: 2021-06-23T23:32:51+08:00
[INFO] ------------------------------------------------------------------------
这样就能提高项目之间的整体性,便于系统继承与维护。
6 项目中的依赖冲突
有时候,A依赖于1.1版本的C,而B依赖与1.2版本的C,这时我们同时引入A和B,启动项目就会报错,怎样去找到冲突的位置呢?
idea提供了“依赖图”这样的方式,在这里,我们同时引入了“commons-beanutils”和“poi”两个依赖。
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.5-FINAL</version>
</dependency>
在pom文件里右键,点击“diagrams->展示依赖”,如图所示。
可以看到标红的地方提示版本冲突,这个怎么办呢?
一般情况下,高版本能适配低版本,我们只需要把原本依赖低版本的那一个改为依赖高版本就可以了。在这里使用的方法是“exclusion”标签,使它原本的配置失效,进而就能使用我们的新配置了。
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.5-FINAL</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
至于这里谁引用了低版本,我也不知道,挨个试吧,可以通过右侧栏引入的依赖看到,若是引用了高版本,说明去除正确,若是反而引用了低版本,说明去反了。
下面给出去反了的例子:
正确去除后,可以看到我们的依赖冲突没有了。