Maven - 配置管理
Maven
Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。Project Object Model:项目对象模型。将Java工程的相关信息封装为对象形式作为便于操作和管理的模型。
Maven作用
1 添加第三方jar包:使用 Maven 后每个 jar 包只需在本地仓库中保存一份
2 jar包之间的依赖关系:Maven 可自动的将当前 jar 包所依赖的其他所有jar包全部导入
3 处理jar包之间的冲突:Maven中内置了两条依赖原则:最短路径者优先和先声明者优先。可以自动的处理jar包之间的冲突问题
4 获取第三方jar包:Maven 会自动从中央仓库下载,并同时下载这个 jar 包所依赖的其他 jar 包——规范、完整、准确!一次性解决所有问题
5 将项目拆分成多个工程模块:Maven 的依赖管理机制,可将项目拆分成多个工程协同开发
6 实现项目的分布式部署:将项目拆分成多个模块后,每个模块可运行在独立的服务器。我们称之为分布式部署
核心概念
①POM ②约定的目录结构 ③坐标 ④依赖管理 ⑤仓库管理 ⑥生命周期 ⑦插件和目标 ⑧继承 ⑨聚合
配置本地仓库
在 Maven 的核心配置文件:D:\apache-maven-3.5.0\conf\settings.xml 中的标签
<localRepository>D:/RepMavenlocalRepository>(指定本地仓库文件路径)
在settings.xml文件 mirrors 标签中配置阿里镜像服务器
<mirror> <id>alimavenid> <mirrorOf>centralmirrorOf> <name>aliyun mavenname> <url>http://maven.aliyun.com/nexus/content/groups/publicurl> mirror>
自动化构建
JavaEE 开发普遍认同的观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。maven默认从<项目根目录>/src/main/java这个目录去查找Java源文件,编译后的class文件会保存在<项目根目录>/target/classes目录。在maven中,所有的PO都有一个根对象,就是Super POM。Super POM中定义了所有的默认的配置项
构建:编写的 Java 代码经过编译得到对应的 .class 文件,将 Web 工程编译的结果“拿”到服务器上的指定目录结构,我们叫部署,在实际项目中除此之外,还包括第三方框架的 jar 包以及各种配置文件。都必须按照正确的目录结构部署到服务器上才可以运行。而这些 Maven 通过一些命令都可以帮我自动构建完成。对应 pom.xml 中也就是
构建环节
①清理:删除以前的编译结果,为重新编译做好准备
②编译:将Java源程序编译为字节码文件
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性
④报告:在每一次测试后以标准的格式记录和展示测试结果
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包
⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行
生命周期
●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了。
●Maven有三套相互独立的生命周期,分别是:
①Clean Lifecycle在进行真正的构建之前进行一些清理工作。
②Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。
③Site Lifecycle生成项目报告,站点,发布站点。
它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。
运行任何一个阶段的时候,它前面的所有阶段都会被运行。 但生命周期是抽象的(Maven的生命周期本身是不做任何实际工作), 任务执行(如编译源代码)均交由插件完成。Maven 的插件机制是完全依赖Maven的生命周期的,所谓的插件 plugin 其实也就是一个maven项目,只不过这个项目会引用maven的一些API,plugin项目也具备maven坐标。
插件和目标
●生命周期的阶段 phase 与插件的目标 goal 相互绑定, 用以完成实际的构建任务.
●每个插件都能实现多个功能,每个功能就是一个插件目标。
●Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
maven命令的语法为 mvn [options] [goal(s)] [phase(s)]
如: mvn compiler:compile 冒号前是插件前缀, 后面是该插件目标或功能
clean 移除所有上一次构建生成的文件
site 生成项目的站点文档
deploy 将生成的站点文档部署到特定的服务器上
继承、依赖、聚合
Maven的聚合特性(aggregation)能够使项目的多个模块聚合在一起构建, 而继承特性(inheritance)能够帮助抽取各模块相同的依赖、插件等配置,在简化模块配置的同时, 保持各模块一致.任何一个Maven项目都隐式地继承自超级POM, 因此超级POM的大量配置都会被所有的Maven项目继承, 这些配置也成为了Maven所提倡的约定. 当一个模块项目引入另一个模块或第三方 jar 包时,我们就称他们之间有依赖关系。依赖有直接依赖和间接依赖,并且规定了之间依赖范围和原则等
父POM
注意:打包方式要设置为 pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>cn.gc.atcrowdfundinggroupId> <artifactId>atcrowdfunding-parentartifactId> <version>0.0.1-SNAPSHOTversion> <packaging>pompackaging> <description>父工程,聚合其他工程description> <properties> <junit.version>4.12junit.version> properties> <> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>${junit.version}version> <scope>testscope> dependency> dependencies> dependencyManagement> <modules> <module>../atcrowdfunding-commonmodule> <module>../atcrowdfunding-managermodule> modules> project>
坐标:使用三个向量在 Maven 的仓库中确定一个Maven工程,由此可用于其他项目模块的依赖或继承
[1] groupId:公司或组织的域名倒序+当前项目名称
[2] artifactId:当前项目的模块名称
[3] version:当前模块的版本
我们自己的 Maven 工程必须执行安装(install)操作才会进入仓库,我们通过坐标可以到仓库中找到对应 jar 包。将gav三个向量连起来再加上 a-v
\cn\gc\maven\maven1\0.0.1-SNAPSHOT\maven1-0.0.1-SNAPSHOT.jar
[4] packaging : 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->
pom 打包父工程,war 打包 Web 工程,jar 打包普通工程
[5] properties : 为pom定义一些常量,在pom中的其它地方可以直接引用,用来控制版本号
使用方式 如 ${junit.version}
[6] dependencyManagement :在父工程中管理依赖
在父工程中引入的 jar 包全部都会被子工程继承,但有时某些子工程我们不需要父工程中的 jar 包。我们可将父工程中的 dependencies 标签,用 dependencyManagement 标签括起来,这样子工程需要什么 jar 包只需引入对应 groupId 和 artifactId 即可版本直接由父工程管理
[7] dependencies 定义本项目的依赖关系
在此标签内如此模块需要引入那个 jar 包只需在此子标签 dependency 中定义即可。依赖管理规定了几个原则
依赖的范围 scope 包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围)
默认为 compile 如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖,通过依赖范围就可控制其直接是否有依赖关系
① compile (默认)
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
② test
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
③ provided
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
④ runtime[了解]
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时会放在WEB-INF的lib目录下
依赖的原则:解决jar包冲突
①路径最短者优先
②路径相同时先声明者优先。先后顺序指的是 dependency 标签配置的先后顺序
依赖的排除:为了确保程序正确可以将有可能重复的间接依赖排除。排除掉后也可以自行依赖其他版本
<exclusions> <exclusion> <groupId>commons-logginggroupId> <artifactId>commons-loggingartifactId> exclusion> exclusions>当依赖、插件的版本、配置等信息在父POM中声明之后, 子模块在使用时就无须声明这些信息, 也就不会出现多个子模块使用的依赖版本不一致的情况, 也就降低了依赖冲突的几率. 另外如果子模块不显式声明依赖与插件的使用, 即使已经在父POM的dependencyManagement、pluginManagement中配置了, 也不会产生实际的效果. [8] modules : 实现聚合的核心,module 值为被聚合模块相对于聚合POM的相对路径, 每个被聚合模块下还各自包含有pom.xml、src/main/java、src/test/java等内容
子工程POM
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <artifactId>atcrowdfunding-managerartifactId> <description>控制器类,业务层接口及实现类,Dao接口及映射文件description> <parent> <groupId>cn.gc.atcrowdfundinggroupId> <artifactId>atcrowdfunding-parentartifactId> <version>0.0.1-SNAPSHOTversion> <relativePath>../atcrowdfunding-parent/pom.xmlrelativePath> parent> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <scope>testscope> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.mybatis.generatorgroupId> <artifactId>mybatis-generator-maven-pluginartifactId> <version>1.3.7version> <dependencies> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.42version> dependency> dependencies> plugin> plugins> build> project>
[9] parent:用于确定父项目的坐标位置
relativePath:指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径
如果子工程的 groupId 和 version 如果和父工程重复则可以删除
在子项目中重新指定需要的依赖,可以不需要改模块的范围和版本号,因为父工程已经帮助管理了
Maven配置详解转载
SuperPom
<project> <modelVersion>4.0.0modelVersion> <repositories> <repository> <id>centralid> <name>Central Repositoryname> <url>https://repo.maven.apache.org/maven2url> <layout>defaultlayout> <snapshots> <enabled>falseenabled> snapshots> repository> repositories> <pluginRepositories> <pluginRepository> <id>centralid> <name>Central Repositoryname> <url>https://repo.maven.apache.org/maven2url> <layout>defaultlayout> <snapshots> <enabled>falseenabled> snapshots> <releases> <updatePolicy>neverupdatePolicy> releases> pluginRepository> pluginRepositories> <build> <directory>${project.basedir}/targetdirectory> <outputDirectory>${project.build.directory}/classesoutputDirectory> <finalName>${project.artifactId}-${project.version}finalName> <testOutputDirectory>${project.build.directory}/test-classestestOutputDirectory> <sourceDirectory>${project.basedir}/src/main/javasourceDirectory> <scriptSourceDirectory>${project.basedir}/src/main/scriptsscriptSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/javatestSourceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resourcesdirectory> resource> resources> <testResources> <testResource> <directory>${project.basedir}/src/test/resourcesdirectory> testResource> testResources> <pluginManagement> <plugins> <plugin> <artifactId>maven-antrun-pluginartifactId> <version>1.3version> plugin> <plugin> <artifactId>maven-assembly-pluginartifactId> <version>2.2-beta-5version> plugin> <plugin> <artifactId>maven-dependency-pluginartifactId> <version>2.8version> plugin> <plugin> <artifactId>maven-release-pluginartifactId> <version>2.3.2version> plugin> plugins> pluginManagement> build> <reporting> <outputDirectory>${project.build.directory}/siteoutputDirectory> reporting> <profiles> <profile> <id>release-profileid> <activation> <property> <name>performReleasename> <value>truevalue> property> activation> <build> <plugins> <plugin> <inherited>trueinherited> <artifactId>maven-source-pluginartifactId> <executions> <execution> <id>attach-sourcesid> <goals> <goal>jargoal> goals> execution> executions> plugin> <plugin> <inherited>trueinherited> <artifactId>maven-javadoc-pluginartifactId> <executions> <execution> <id>attach-javadocsid> <goals> <goal>jargoal> goals> execution> executions> plugin> <plugin> <inherited>trueinherited> <artifactId>maven-deploy-pluginartifactId> <configuration> <updateReleaseInfo>trueupdateReleaseInfo> configuration> plugin> plugins> build> profile> profiles> project>