Maven是什么?
Maven是一个软件(特别是Java)项目管理及构建工具
maven原理:
Maven主要基于三个组件进行项目管理:
pom.xml 文件定义了项目依赖的插件(java项目的依赖的Jar包),包括插件的名称和版本。Maven会解析pom.xml配置,首先去本地仓库中寻找项目依赖的插件,本地仓库不存在,将会去远程仓库下载到本地仓库中。
Maven会在项目构建时,将项目依赖的插件复制到项目lib目录中
pom配置详解:
<project>
…
<dependencies>
<dependency>
<groupId>…groupId>
<artifactId>…artifactId>
<version>…version>
<type>…type>
<scope>…scope>
<optional>…optional>
<exclusions>
<exclusion>
…
exclusion>
exclusions>
dependency>
dependencies>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
…
project>
dependencies 根元素project下的dependencies 可以包含一个或多个dependency元素,以声明一个或多个项目依赖。每个依赖可以包含的元素有
groupId、artifactId 和 **version:**依赖的基本坐标,是必须要有的。
type: 依赖的类型,对应项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
scope: 依赖的范围(Maven有三种classpath:编译classpath 、测试classpath、运行classpath)
optional: 标记依赖是否可选
exclusion: 用来排除传递性依赖
依赖范围与classpath的关系
依赖范围(scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行classpath有效 |
---|---|---|---|
compile | √ | √ | √ |
test | × | √ | × |
provided | √ | √ | × |
runtime | × | √ | √ |
system | √ | √ | × |
Maven定义了一组规则:世界上任何一个插件都可以使用Maven坐标唯一标识。Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。只要我们提供正确的坐标元素,Maven就能找到对应的插件。
maven依赖的坐标:公司的名称 + 项目名称 + 版本号
groupId: 定义当前Maven项目隶属的实际项目或者项目组。groupId的表示方式与Java包名的方式类似
artifactId: 该元素定义实际项目中的一个maven项目(模块),推荐使用实际项目名称作为artifactId的前缀
version:定义Maven项目当前所处的版本
package:定义Maven项目的打包方式。默认的打包方式是jar
classifier:定义插件输出的一些附属插件。
注:groupId、artifactId、version是必须的,packaging是可选的,classifier是不能直接定义的
jar包在Maven中存放的路径:
Maven 仓库的布局方式:任何一个插件都有唯一的坐标,根据这个坐标可以定义仓库的唯一的存储路径,该路径与坐标的大致对应关系为: groupId/artifactId/version/artifactId-version.packaging
图2中的依赖的插件:
org.springframework:spring:2.5.6起对应在仓库中的路径为:org/springframework/2.5.6/spring-2.5.6.jar
对Maven来说,仓库只分为两类: 本地仓库 和 远程仓库。 当Maven根据坐标寻找插件的时候,它会先检查本地仓库,如果本地仓库存在此插件,则直接使用;如果本地仓库不存在此插件,或者需要查看是否有更新的插件版本,Maven就会去远程仓库查找,发现需要的插件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。
本地仓库
如果想要所有用户都使用一个本地仓库,可以修改{M2_HOME}/conf/setting.xml下的localRespository元素
插件部署在本地仓库,一般有两种方式:
远程仓库
对Maven来说,每个用户只有一个本地仓库,但是可以有很多的远程仓库。
中央仓库: 由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库是一个默认的远程仓库。Maven的安装文件自带了中央仓库的配置。
私服: 一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,作为缓存,供局域网内部的Maven用户使用。
远程仓库的验证的配置:在{user.home}/.m2/settings.xml中添加server 元素的配置:
Maven镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句说,任何可以从Y得到的插件都可以从X得到。
镜像的配置:在{user.home}/.m2/settings.xml中添加 mirror 元素的配置
依赖传递:
当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖时从哪条依赖路径引入的。
Maven依赖调解有两条依赖调解原则:
路径最近者优先:A–>B–>C–>X(1.0)、A–>D–>X(2.0) ,最终X(2.0)会被解析使用
第一声明者优先:A-> C->X(1.0)、A->D->X(2.0),pom中谁先定义用谁
依赖排除:
传递性依赖会给项目隐式地映入很多依赖,这极大地简化了项目依赖的管理,但是有些时候会带来一些问题。
举例: A -> B -> C (1.0.0)
A 依赖于 第三方的库 B,但是由于某些原因B依赖于另一个第三方的库C,而C是一个SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目。这时就需要删除这个SNAPSHOT版本,引入一个C的稳定版本(1.1.0)。
<dependencies>
<dependency>
<groupId>com.xxx.demogroupId>
<artifactId>project-bartifactId>
<version>1.0.0version>
<exclusions>
<exclusion>
<groupId>com.xxx.demogroupId>
<artifactId>project-cartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.xxx.demogroupId>
<artifactId>project-cartifactId>
<version>1.1.0version>
dependency>
dependencies>
mvn clean: 该命令调用生命周期的clean阶段。实际执行的阶段为clean 生命周期的 pre-clean 和 clean阶段。
mvn test: 该命令调用default生命周期的test阶段
mvn clear package: 该命令调用 default 生命周期的 package阶段(仅打包)
mvn clear install:将包安装到Maven本地仓库,供本地其他Maven项目使用(布署到本地maven仓库)
mvn clean deploy:deploy命令完成了项目编译、单元测试、打包功能,同时布署到本地和远程仓库
mvn install -Dmaven.test.skip = true:跳过单元测试的install
想把一个写好的工具jar 打包到 nexus(私服)上去
Maven\conf\setting.xml 中要配置远程仓库的验证的配置
<server>
<id>adminid>
<username>adminusername>
<password>admin123password>
server>
项目pom中添加
<distributionManagement>
<snapshotRepository>
<id>adminid>
<name>Local Nexus Repositoryname>
<url>http://10.1.63.xx:8088/nexus/content/groups/public/url>
snapshotRepository>
distributionManagement>
执行Maven deploy命令
注意 pom文件的id 要和在 maven中配置的server的id 一致 否则不起作用
它是maven中针对打包任务而提供的标准插件
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<excludes>
<exclude>static/**exclude>
excludes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>falsefiltering>
<includes>
<include>static/**include>
includes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<excludes>
<exclude>static/**exclude>
excludes>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<configuration>
<skipTests>trueskipTests>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<excludes>
<exclude>*.propertiesexclude>
<exclude>*.xmlexclude>
<exclude>*.ymlexclude>
<exclude>*.shexclude>
excludes>
<archive>
<manifest>
<addClasspath>trueaddClasspath>
<mainClass>com.ebupt.crbt.ApplicationmainClass>
<classpathPrefix>lib/classpathPrefix>
manifest>
archive>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-assembly-pluginartifactId>
<version>2.2-beta-5version>
<configuration>
<descriptors>
<descriptor>src/main/resources/package.xmldescriptor>
descriptors>
<finalName>${project.artifactId}finalName>
<outputDirectory>${project.build.directory}/outputDirectory>
configuration>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>singlegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>webAppid>
<formats>
<format>zipformat>
formats>
<includeBaseDirectory>trueincludeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/resourcesdirectory>
<outputDirectory>/outputDirectory>
<includes>
<include>*.shinclude>
<include>*.propertiesinclude>
<include>*.jsoninclude>
<include>*.propertiesinclude>
<include>*.xmlinclude>
<include>*.mdinclude>
includes>
fileSet>
<fileSet>
<directory>${project.basedir}/src/main/resourcesdirectory>
<outputDirectory>/configoutputDirectory>
<includes>
<include>*.ymlinclude>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}directory>
<outputDirectory>/outputDirectory>
<includes>
<include>*.jarinclude>
includes>
fileSet>
<fileSet>
<directory>${project.basedir}/src/main/resourcesdirectory>
<outputDirectory>/binoutputDirectory>
<includes>
<include>*.shinclude>
includes>
fileSet>
fileSets>
<dependencySets>
<dependencySet>
<useProjectArtifact>falseuseProjectArtifact>
<outputDirectory>/liboutputDirectory>
dependencySet>
dependencySets>
assembly>
下载(省略),下载完成解压:nexus-2.12.0-01
安装和卸载
解压到没有中文的路径下
使用管理员身份打开cmd 进入到E:\develop\nexus\nexus-2.12.0-01\bin 输入下面命令进行安装
修改配置文件/访问私服
application-port=8081
application-host=127.0.0.1
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus
安装命令: nexus install
启动服务:nexus start
停止服务:nexus stop
卸载命令:nexus uninstall
修改后访问:localhost:8081/nexus
宿主仓库(hosted): 当前私服自己维护的仓库,Nexus 有下面三个(repositoryId):
代理仓库(proxy): apache测试包,中央仓库的jar包(私服去中央仓库下载后的jar包存在这里)
虚拟仓库(virtual): maven1的jar包
组仓库(group): 宿主仓库/代理仓库,配置私服下载时用这个,既有自己发布的jar包又有从中央仓库下载的jar
配置上传的路径(需要上传的项目的pom文件中)
<distributionManagement>
<repository>
<id>releasesid>
<url>http://localhost:8081/nexus/content/repositories/releases/url>
repository>
<snapshotRepository>
<id>snapshotsid>
<url>http://localhost:8081/nexus/content/repositories/snapshots/url>
snapshotRepository>
distributionManagement>
在例如:
<distributionManagement>
<snapshotRepository>
<id>iipid>
<name>Local Nexus Repositoryname>
<url>http://10.1.xx.xx:8088/nexus/content/groups/public/url>
snapshotRepository>
distributionManagement>
如果访问需要认证的话,需要在settings.xml文件中设置:
配置私服的账号和密码(maven/conf/settings.xml)
<server>
<id>releasesid>
<username>adminusername>
<password>admin123password>
server>
<server>
<id>snapshotsid>
<username>adminusername>
<password>admin123password>
server>
<server>
<id>thirdpartyid>
<username>adminusername>
<password>admin123password>
server>
从私服下载jar包,maven/conf/settings.xml相关配置
a. 配置下载的位置模板(maven/conf/settings.xml)
<profile>
<id>devid>
<repositories>
<repository>
<id>nexusid>
<url>http://localhost:8081/nexus/content/groups/public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>publicid>
<name>Public Repositoriesname>
<url>http://localhost:8081/nexus/content/groups/public/url>
pluginRepository>
pluginRepositories>
profile>
b. 激活下载的位置模板(maven/conf/settings.xml)
<activeProfiles>
<activeProfile>devactiveProfile>
activeProfiles>
从什么库地址可以下载项目依赖的库文件(pom中如下配置)
<repositories>
<repository>
<id>alimavenid>
<url>https://maven.aliyun.com/repository/publicurl>
repository>
repositories>
注意:如果需要认证才能访问,则需要在settings.xml文件中添加如下内容,并且server中的id字段的值要与repository中id字段的值相同
<servers>
<server>
<id>nexusid>
<username>adminusername>
<password>admin123password>
server>
servers>