Maven 收拾
Maven简介
Maven的实质是一个项目办理工具,将项目开发和办理进程笼统成一个项目方针模型(POM:Project Object Model)
这玩意儿是运用Java开发的,所以选用的便是Java的思维:面向方针
Maven的效果:
- 项目构建:供给规范的、跨渠道的自动化项目构建方法
- 依靠办理:便利快捷的办理项目依靠的资源(jar包),防止资源间的版别抵触问题
- 一致开发结构:供给规范的、一致的项目结构
下载与装置:
- 官网:http://maven.apache.org/
- 下载:http://maven.apache.org/download.cgi
Maven根底概念
库房:用于存储资源,包括各种jar包
库房分类:本地库房和长途库房(私服和中心库房)
坐标:Maven中的坐标用于描绘库房中资源的方位
坐标的首要组成:
- groupId:界说当时Maven项目从属安排称号(通常是域名反写)
- artifactId:界说当时Maven项目称号(通常是模块称号)
- version:界说当时版别号
- packaging:界说该项意图打包方法
坐标的效果:运用仅有的标识,仅有性定位资源方位,经过该标识能够将资源的辨认与下载交由机器完结。
库房装备:
- 本地库房装备:默许方位与自界说方位
- 长途库房装备:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://maven.aliyun.com/repository/central</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
镜像库房装备:阿里云Maven镜像库房装备地址
<mirrors>
<mirror>
<!-- 此镜像的仅有标识符,用来差异不同的mirror元素 -->
<id>nexus-aliyun</id>
<!-- 对那种库房进行镜像(便是代替哪种库房)-->
<mirrorOf>central</mirrorOf>
<!-- 镜像称号 -->
<name>Nexus aliyun</name>
<!-- 镜像URL -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
大局setting和用户setting
- 界说当时计算机中Maven的公共装备,即 mavne装置目录/conf/setting.xml
- 界说当时用户装备,即 装备的本地库房地址处有个平级的setting.xml
注:用户setting和大局setting不一致时,会优先选用用户setting.xml的装备,因而最好是这二者内容保持一致
Maven项目
手动生成Maven项目
Maven工程目录结构
Maven项目构建指令:Maven构建指令运用mvn最初,后边加功用参数,能够一次履行多个指令,运用空格分隔
mvn compile # 编译
mvn clean # 整理
mvn test # 测验
mvn package # 打包
mvn install # 装置到本地库房
IDEA生成Maven项目
运用原型创立Maven项目与不运用原型创立Maven项目
例:运用原型创立web项目,挑选archetype-webapp进行项目创立,增加Tomcat插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
依靠办理
-
依靠装备:依靠指的是当时项目运转所需求的jar,一个项目能够设置多个依靠。格局:
<!--设置当时项目所依靠的一切jar--> <dependencies> <!--设置详细的依靠--> <dependency> <!--依靠所属群组id--> <groupId></groupId> <!--依靠所属项目id--> <artifactId></artifactId> <!--依靠版别号--> <version></version> <!-- <type>pom</type> <scope>import</scope> 只能用在 <dependencyManagement></dependencyManagement> 中 --> <!--类型:jar 则导入jar包 pom 导入的是一个父模块--> <type></type> <!-- 效果域:import 代表把父模块中的jar包导入进来 为import时,dependency不参加依靠传递 仅仅把dependency需求的依靠都取过来,像个占位符相同替换了就行 --> <scope>import</scope> </dependency> </dependencies>
-
依靠传递
依靠具有传递性,包括直接传递和直接传递
直接传递:在当时项目中经过依靠装备树立的依靠联系(A运用B,A和B便是直接传递)
直接传递:被依靠的资源假如依靠其他资源,当时项目直接依靠其他资源(比较拗口,意思是假如A依靠B,而B依靠C,那么A和C之间便是直接传递)
依靠传递的抵触问题:
- 途径优先:当依靠中呈现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依靠时,装备次序靠前的掩盖装备次序靠后的
- 特别优先:当同级装备了相同资源的不同版别,后装备的掩盖先装备的
- 可选依靠
可选依靠指的是对外躲藏当时所依靠的资源
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--增加下面这一行-->
<optional>true</optional>
</dependency>
- 扫除依靠
扫除依靠指自动断开依靠的资源,被扫除的资源无需指定版别
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
- 依靠规模
依靠的jar包默许状况能够在任何地方运用,能够经过scope标签设定其效果规模
效果规模:
- 主程序规模有用(main文件夹规模内)
- 测验程序规模有用(test文件夹规模内)
- 是否参加打包(package文件夹规模内)
还有两个:system、import
- import:依靠项替换为指定 POM 的
<dependencyManagement>
中的该依靠项。仅<dependencyManagement>
部分中 pom 类型的依靠项支撑此规模
- 依靠规模传递性:带有依靠规模的资源在传递时,效果规模会受到影响
生命周期与插件
Maven项目构建生命周期描绘的是一次构建进程阅历了多少个事情
Maven对项目构建的生命周期划分为3套
- clean:整理作业
- default:中心作业,例如编译、测验、打包、布置等
- site:发生陈述,发布站点等
clean生命周期:
- pre-clean:履行一些需求在clean之前完结的作业
- clean:移除一切上一次构建生成的文件
- post-clean:履行一些需求在clean之后马上完结的作业
default构建生命周期:compile ——> test-compile ——> test ——> package ——> install
-
validate(校验) 校验项目是否正确而且一切必要的信息能够完结项意图构建进程
-
initialize(初始化) 初始化构建状况,比方设置特点值
-
generate-sources(生成源代码) 生成包括在编译阶段中的任何源代码
-
process-sources(处理源代码) 处理源代码,比方说,过滤恣意值
-
generate-resources(生成资源文件) 生成将会包括在项目包中的资源文件
-
process-resources (处理资源文件) 仿制和处理资源到方针目录,为打包阶段最好预备
-
compile(编译) 编译项意图源代码
-
process-classes(处理类文件) 处理编译生成的文件,比方说对Java class文件做字节码改进优化
-
generate-test-sources(生成测验源代码) 生成包括在编译阶段中的任何测验源代码
-
process-test-sources(处理测验源代码) 处理测验源代码,比方说,过滤恣意值
-
generate-test-resources(生成测验资源文件) 为测验创立资源文件
-
process-test-resources(处理测验资源文件) 仿制和处理测验资源到方针目录
-
test-compile(编译测验源码) 编译测验源代码到测验方针目录
-
process-test-classes(处理测验类文件) 处理测验源码编译生成的文件
-
test(测验) 运用适宜的单元测验结构运转测验(Juint是其中之一)
-
prepare-package(预备打包) 在实践打包之前,履行任何的必要的操作为打包做预备
-
package(打包) 将编译后的代码打包成可分发格局的文件,比方JAR、WAR或许EAR文件
-
pre-integration-test(集成测验前) 在履行集成测验前进行必要的动作。比方说,建立需求的环境
-
integration-test(集成测验) 处理和布置项目到能够运转集成测验环境中
-
post-integration-test(集成测验后) 在履行集成测验完结后进行必要的动作。比方说,整理集成测验环境
-
verify (验证) 运转恣意的查看来验证项目包有用且到达质量规范
-
install(装置) 装置项目包到本地库房,这样项目包能够用作其他本地项意图依靠
-
deploy(布置) 将终究的项目包仿制到长途库房中与其他开发者和项目同享
site生命周期:
-
pre-site 履行一些需求在生成站点文档之前完结的作业
-
site 生成项意图站点文档
-
post-site 履行一些需求在生成站点文档之后完结的作业,而且为布置做预备
-
site-deploy 将生成的站点文档布置到特定的服务器上
插件:插件与生命周期内的阶段绑定,在履行到对应的生命周期时履行对应的插件功用
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<!--履行插件-->
<executions>
<!--详细怎样履行-->
<execution>
<!--方针:履行什么-->
<goals>
<!--履行jar-->
<goal>jar</goal>
</goals>
<!--履行到那个生命周期阶段时就要履行该插件 对应前面default中的那些值-->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
<goal>jar</goal>
值选项:官网:Apache Maven Source Plugin
- source:aggregate aggregrates sources for all modules in an aggregator project.
- source:jar is used to bundle the main sources of the project into a jar archive——对main中源代码打包
- source:test-jar on the other hand, is used to bundle the test sources of the project into a jar archive——对测验代码打包
- source:jar-no-fork is similar to jar but does not fork the build lifecycle.
- source:test-jar-no-fork is similar to test-jar but does not fork the build lifecycle.
聚合
效果:聚合用于快速构建Maven工程,一次性构建多个项目/模块
制造方法:创立一个空模块,打包类型界说为pom
<packaging>pom</packaging>
界说当时模块进行构建操作时相关的其他模块称号
<modules>
<module>模块地址</module>
<module>模块地址</module>
<module>模块地址</module>
<module>模块地址</module>
</modules>
留意:参加聚合操作的模块终究履行次序与模块间的依靠联系有关,与装备次序无关
承继
效果:经过承继能够实现在子工程中沿袭父工程中的装备(与Java相似)
制造方法:在子工程中生命其父工程坐标与对应的方位
<!--界说该工程的父工程-->
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--填写父工程的pom文件-->
<relativePath>父工程pom文件地址</relativePath>
</parent>
在父工程中界说依靠办理
<!--声明此处进行依靠办理-->
<dependencyManagement>
<!--详细的依靠-->
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
<!--要办理插件的话,运用如下方法-->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!--.....................-->
</plugin>
</plugins>
</pluginManagement>
</build>
承继依靠运用:在子工程中界说依靠联系,无需声明依靠版别,版别参照父工程中依靠的版别
<!--子工程运用依靠-->
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>
</dependencies>
<!--子工程运用插件-->
<build>
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<!--<version></version>-->
</plugin>
</plugins>
</build>
承继的资源:
承继与聚合的差异
效果:聚合用于快速构建项目,承继用于快速装备
相同点:
-
聚合与承继的pom.xml文件打包方法均为pom,能够将两种联系制造到同一个pom文件中
-
聚合与承继均归于规划型模块,并无实践的模块内容
不同点:
-
聚合是在当时模块中装备联系,聚合能够感知到参加聚合的模块有哪些
-
承继是在子模块中装备联系,父模块无法感知哪些子模块承继了自己
特点
- 自界说特点
效果:等同于界说变量,便利一致保护
界说格局:
<!--界说自界说特点-->
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
调用格局:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
- 内置特点
效果:运用Maven内置特点,快速装备
调用格局:
${basedir}
${version}
- Setting特点
效果:运用Maven装备文件setting.xml中的标签特点,用于动态装备
调用格局:
${settings.localRepository}
- Java体系特点
效果:读取Java体系特点
调用格局:
${user.home}
体系特点查询方法:
mvn help:system
- 环境变量特点
效果:运用Maven装备文件setting.xml中的标签特点,用于动态装备
调用格局:
${env.JAVA_HOME}
环境变量特点查询方法:
mvn help:system
版别办理
SNAPSHOT(快照版别):
- 项目开发进程中,便利团队成员协作,处理模块间相互依靠和实时更新的问题,开发者对每个模块进行构建的时分,输出的临时性版别就叫快照版别(测验阶段版别)
- 快照版别会跟着开发的发展不断更新
RELEASE(发布版别):
- 项目开发到进入阶段里程碑后,向团队外部发布较为安稳的版别,这种版别所对应的构建文件是安稳的,即使进行功用的后续开发,也不会改动当时发布版别的内容,这种版别就叫发布版别
工程版别号约好:
资源装备
装备文件引证pom特点
效果:在恣意装备文件中加载pom文件中界说的特点
- pom中界说变量:
<properties>
<jdbc.username>root</jdbc.username>
<jdbc.password>zixieqing072413</jdbc.password>
</properties>
- pom中敞开装备文件加载pom特点
<build>
<!--装备资源文件对应的信息-->
<resources>
<resource>
<!--设定装备文件对应的方位目录 如 application.yml
支撑运用特点动态设定途径 如 ${project.basedir}-->
<directory>地址</directory>
<!--敞开对装备文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
<!--test装备文件也需求运用时:装备资源文件对应的信息-->
<testResources>
<testResource>
<!--设定装备文件对应的方位目录 如 application.yml
支撑运用特点动态设定途径 如 ${project.basedir}-->
<directory>地址</directory>
<!--敞开对装备文件的资源加载过滤-->
<filtering>true</filtering>
</testResource>
</testResources>
</build>
- 在需求运用变量得到装备文件中运用,调用格局:
${地址}
<!--示例-->
${jdbc.username}
多环境开发装备
<!--创立多环境-->
<profiles>
<!--界说详细的环境:出产环境-->
<profile>
<!--界说环境对应的仅有称号 如 prod_env-->
<id>开发环境称号1</id>
<!--界说环境中的专用的特点值-->
<properties>
<jdbc.url>jdbc链接</jdbc.url>
</properties>
<!--将该套环境设为默许发动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--界说详细的环境:开发环境 格局同上-->
</profiles>
Maven运用指令发动那套环境:
mvn 指令 -p 环境界说id
# 示例
mvn install -p prod_env
越过测验
提示
正式开发时,不主张越过
越过测验的场景:
- 全体模块功用未开发
- 模块中某个功用未开发结束
- 单个功用更新调试导致其他功用失利
- 快速打包
- .........................
运用方法:
- 指令的方法
mvn 指令 –D skipTests
# 示例
mvn install –D skipTests
留意
履行的指令生命周期有必要包括测验环节
- 运用IDEA界面操作
- 运用pom装备
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!-- 设置越过测验 -->
<skipTests>true</skipTests>
<!-- 包括指定的测验用例 -->
<includes>
<include>**/User*Test.java</include>
</includes>
<!-- 扫除指定得到测验用例 -->
<excludes>
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>
私服
运用Nexus,是sonatype的产品:
- 下载地址1:https://help.sonatype.com/repomanager3/download
- 下载地址2:https://www.sonatype.com/thanks/repo-oss
发动服务器(Windows):
nexus.exe /run nexus
拜访服务器:默许端口8081,可在其装备文件中修正
http://localhost:8081
修正根底装备信息:装置途径/etc/nexus-default.properties,如默许端口号
修正服务器运转装备:装置途径/bin/nexus.vmoptions,如默许内存空间巨细
IDEA中资源上传和下载
私服库房分类:
宿主库房(hosted):保存无法从中心库房获取的资源,如
- 自主研制
- 第三方非开源项目
署理库房(proxy):署理长途库房,经过Nexus拜访其他公共库房
库房组(group):
- 将若干库房组成一个群组,简化装备
- 库房组不保存资源,归于规划型库房
私服用户名暗码:装备在本地库房的setting.xml中即可
上传方位:装备在IDEA中,上传到私服中的库房组不同
下载地址:装备在本地库房的setting.xml即可
拜访私服装备
- 装备本地库房拜访私服权限(setting.xml)
<servers>
<server>
<!--放release版别的 和nexus中命名保持一致-->
<id>zixq-release</id>
<!--拜访私服的用户名暗码-->
<username>admin</username>
<password>admin</password>
</server>
<server>
<!--放snapshots版别的-->
<id>zixq-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
- 装备本地库房来历(setting.xml)
<!--能够和阿里云库房一起存在-->
<mirrors>
<mirror>
<id>nexus-zixq</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
IDEA发布依靠到私服装备
- 装备当时项目拜访私服上传资源的保存方位(pom.xml)
<distributionManagement>
<repository>
<!--库房id,和上面本地库房setting.xml中server id保持一致-->
<id>zixq-release</id>
<!--放release版库房的url-->
<url>http://localhost:8081/repository/zixq-release/</url>
</repository>
<snapsho