Maven的作用
- 管理jar包的一些列问题
先从本地仓库下载,但是如果本地仓库没有该jar包的话就到中央仓库下载,而且会自动解决jar包的依赖性 - 整合项目
我们可以将一个大项目分成多个小项目,然后将项目打包到本地仓库中(通过命令打包成jar,war或pom,后续会说到三者区别),供其他项目使用,通过此方法将其整理起来
Maven使用前的准备(示例为下载插件后的eclipse)
- 下载Maven:
http://maven.apache.org/download.cgi
- 配置环境:JAVA_HOME和MAVEN_HOME并将其两者的bin目录配置到path中
- 在cmd中输入mvn -v可测试是否成功
- 配置本地仓库:在maven文件的根目录里面有个setting.xml文件
- 在eclipse里面创建maven项目之前想要配置maven版本和本地仓库
Maven的使用
- 创建Maven项目,第一次会下载一些需要的jar包,所以会稍微久一点
- 在pom.xml开头部分中会有一个唯一的gav(个人习惯)
<groupId>org.studey.maven</groupId>
<artifactId>study_1</artifactId>
<version>0.0.1-SNAPSHOT</version>
这个可以理解成这个项目的坐标,当我们使用时可以用这个gav来定位这个项目
- 注入jar包格式如下(普通情况在去mvn那里复制过来即可导入,如果是自己的项目就打包安装到仓库后再写)
<dependencies>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>xxx</version>
<scope>范围</scope>
</dependency>
</dependencies>
- 写完代码后输入相关指令后即可运行,常见指令会在另一处说
maven传递依赖
-
传递依赖:
举个例子,如果A.jar依赖B.jar,而B.jar依赖C.jar,此时当**pom.xml文件中B和C的jar包的scope为compile(默认)**时,A.jar会自动依赖C.jar -
手动取消传递依赖
举个例子,A.jar依赖B.jar,B.jar依赖C.jar和D.jar,此时pom.xml文件中B和C,D的jar包的scope为compile(默认),A.jar会自动依赖C.jar和D.jar,但是我们知道我们并没用使用到D.jar,此时我们可以手动取消D.jar的依赖(在pom里加入下面代码)
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
</exclusion>
</exclusions>
统一JDK版本
- 统一单个项目的JDK版本(例子为1.8版本)
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
设置一个变量
在pom.xml中设置一个变量便利于我们修改一些重复使用的东西,例如版本号,编码格式等等,我们可以用一个变量来替代以方便修改(这种变量的写法有点类似于EL表达式)
这个例子中的命名时很不规范的,此处只是为了做出明显的区分
将junit的版本号定为一个变量,方便修改
<properties>
<demo_1>4.1</demo_1>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${demo_1}</version>
<scope>test</scope>
</dependency>
</dependencies>
继承
在依赖中,我们要经常盯着该依赖与依赖本身的依赖的关系是否为compile,这样很麻烦,我们此时可以用继承获取其两者原本不是compile的依赖(简单说就是如果依赖A继承依赖B,那A就继承了B的所有依赖,不管B与这些依赖的关系是否为compile)
注意点:
- 父工程在创建maven项目时的Packaging要为pom
- 父工程的依赖格式要与普通工程的格式多加一个dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 子工程如果要继承父工程需要进行两个配置:父工程的gav和该工程到父工程pom.xml的相对路径(例如:…/Demo/pom,xml)
tips:如果父类的g是一样的可以删除子类的g
<parent>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>xxx</version>
<relativePath>到父工程pom.xml相对路径</relativePath>
</parent>
- 在子工程中声明用到了父工程的那些依赖(只需要ga无需v),格式仍然向原本的依赖一样即可
<dependencies>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
</dependency>
</dependencies>
Maven的聚合
举个例子,项目demo1依赖项目demo2,那此时必须先用到demo1加入(install)到本地仓库,
但是如果有多个项目的时候要进行多次install,太过累赘.此时我们可以使用一个总项目(该项目的Packaging为pom)进行聚合.
<modules>
<module>项目1的相对根路径(例:../demo1)</module>
<module>项目2的相对根路径(例:../demo2)</module>
</modules>
tips:项目写的时候无先后顺序,无需管先使用到哪一个
Maven的常见命令
我觉得这个人写的非常通俗易懂了
https://blog.csdn.net/weixin_33814685/article/details/93560414
scope属性的范围
compile | test | provided | |
---|---|---|---|
主程序(main) | √ | x | √ |
测试程序(test) | √ | √ | √ |
部署(运行) | √ | x | x |
Jar,War和Pom的区别
Jar | War | Pom |
---|---|---|
将会打包成jar用作jar包使用 | 将会打包成war,发布在服务器上的工程。如网站或服务 | 用在父级工程或聚合工程中。用来做jar包的版本控制 |