前提
1、如果项目很庞大,就不再适合继续用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。借助于Maven可以将一个项目拆分成多个工程。
2、maven可以把jar包仅仅保存在仓库中,有需要使用的工程引用这个文件接口
3、maven可以以一种规范的方式下载jar包,因为所有知名框架或第三方工具的jar包按照统一的规范存放在maven的中央仓库中
4、maven会自动将依赖的jar包导入进来
maven是一款服务于Java平台的自动化构建工具。
配置本地库
<localRepository>C:\Program Files\apache-maven-3.8.1-bin\localRepository</localRepository>
配置阿里云镜像
…\JetBrains\IntelliJ IDEA 2020.3.2\plugins\maven\lib\maven3\conf
为了下载 jar 包方便,在 Maven 的核心配置文件 settings.xml 文件的标签里面配置以下标签:
<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf> <name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
配置jdk版本
<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>
Maven仓库
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。
仓库中的任何一个构件都有其唯一的坐标, 根据这个坐标可以定义其在仓库中的唯一存储路径。得益于Maven的坐标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。
Maven可以在某个位置统一存储所有的 Maven项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
对于Maven来说,仓库分为两类:本地仓库和远程仓库。
Maven工具基于POM (Project Object Model,项目对象模型)模式实现的
在Maven中每个项目都相当于是一个对象, 对象(项目)和对象(项目)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。
一些概念:
groupid:公司或组织域名倒叙+项目名
artifaid:模块名
version:版本号
私服:架设在当前局域网环境下,为当前局域网范围内的所有maven工程服务(如:Nexus)
中央仓库:架设在Internet上,为全世界所有maven工程服务
依赖关系
在pom.xm|文件根元素project下的dependencies标签中,配置依赖信息,内可以包含多个dependence元素,以声明多个依赖。
每个依赖dependence标签都应该包含以下元素: groupld, artifactld, version :依赖的基本坐标,对于任何一 个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
省去了手动添加jar包的操作,并且解决了jar包冲突的问题。
传递性依赖
假设你的项目依赖于一个库,而这个库又依赖于其他库。不必去找出所有这些依赖,只需要加上直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。
注:项目之间可以相互依赖,只需要用install打包后,在其它项目内添加依赖即可
依赖保证两个原则:最短路径优先原则;最先声明原则。
排除依赖:不使用某个jar包 可根据它的id 排除使用
依赖范围
compile:默认范围。表示该依赖在编译和运行时有效
provided:已提供依赖范围。使用此依赖范围的Maven依赖。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如: servlet-api)
runtime:runtime范围表明编译时不需要生效,而只在运行时生效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
system:系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR, 此类依赖应该一直有效, Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。
test:test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。Junit的jar包就在测试阶段用就行了,你导出项目的时候没有必要把junit的东西到处去了就,所在在junit坐标下加入scope -test
Import:import范围只适用于pom文件中的< dependencyManagement>部分。表明指定的POM必须使用
注意: import只能用在dependencyManagement的scope里。
如果加了
聚合关系
当开发的工程拥有两个以上的模块时,每个模块都是一个独立的功能集合。这时就需要一个聚合工程。
聚合项目必须是一个pom类型的项目,总的工程必须是一个POM工程。聚合包含了继承的特性。
聚合时多个项目的本质还是一个项目。 这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现
资源拷贝插件
Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录 下的配置文件在打包时不会添加到项目中。
pom.xml配置片段:
< build><resources><resource> //配置java包下的资源文件< directory> src/main/java </directory><includes><include> **/*.xml </include></includes></resource><resource> //配置resources包下的资源文件<directory> src/main/resources </directory><includes ><include> **/*.xml </include><include> **/*.properties </include></includes></resource></resources></build>
Tomcat插件
<build><plugins><!--配置Tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId> tomcat7-maven-plugin </artifactId><version>2.2 </version><configuration><!--配置Tomcat监听端口--><port> 8080</port><!--配置项目的访问路径(Application Context) --><path>/ </path></configuration></plugin></plugins></build>
