相信每一个java开发人员对maven都不陌生,它和git,svn,idea同样,伴随着咱们开发的每一分钟。
但你在大多数时候,只是在使用它,你真的认识它,了解它,熟悉它吗?
今天我来分享一点,我在项目中使用maven总结出的东西java
仓库,是用来存放东西的地方,maven仓库也是同样,用来存放咱们会用到的一些构件
Maven 仓库能帮助咱们管理构件(主要是JAR),它就是放置全部JAR文件(WAR,ZIP,POM等等)的地方。
Maven 仓库有两种类型:git
运行 Maven 的时候,Maven 所须要的任何构件都是直接从本地仓库获取的。若是本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,而后再使用本地仓库的构件。web
在本地仓库中已存在的构件,包括从远程仓库获取的以及本地项目install进去的项目,都是最早优先级被被项目使用的spring
本地仓库默认路径为 本机用户下: .m2/respository/ 文件夹,也能够在settings.xml中指定本地仓库路径apache
<localRepository>/path/to/local/repo</localRepository>
中央仓库是maven最核心的仓库,也是默认使用的仓库。中央仓库由 Maven 社区提供,包含了绝大多数流行的开源Java构件,以及源码、做者信息、SCM、信息、许可证信息等。通常来讲,简单的Java项目依赖的构件均可以在这里下载到。
中央仓库Nexustomcat
后面找时间单独写一篇发布日记网络
因为中央仓库的开源等条件限制,不少构件并不会发布到中央仓库,不少组织或单位就定制了本身的仓库,包含了所须要的代码库或者其余工程中用到的构件。mvc
emsp; 在平常项目开发中,不一样项目,可能须要用到不一样的远程仓库来下载构件,咱们一般使用一下两种方式来维护远程仓库地址:app
emsp; 默认状况下,远程仓库使用的就是中央仓库,但受限于国内网络环境,咱们一般使用国内镜像仓库,好比阿里云Maven仓库。maven
<mirrors> <mirror> <id>aliyunmaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
属性 | 描述 |
---|---|
id | 镜像标识(惟一) |
name | 镜像描述 |
url | 仓库地址 |
mirrorOf | 仓库匹配模式 |
属性 | 描述 |
---|---|
central | 指向中央仓库的构件匹配到本仓库 |
* | 匹配全部构件到本仓库 |
repo1,repo2 | 匹配仓库repo1和repo2,使用逗号分隔多个远程仓库 |
*,!repo1: | 匹配除repo1外全部远程仓库,使用感叹号将仓库从匹配中排除 |
须要注意的是,因为镜像仓库彻底屏蔽了被镜像仓库,当镜像仓库不稳定或者中止服务的时候,Maven仍将没法访问被镜像仓库,于是将没法下载构件。
<repository> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository>
<repository> <id>activiti-repos2</id> <name>Activiti Repository 2</name> <url>https://app.camunda.com/nexus/content/groups/public</url> </repository>
<repository> <id>springsource-repos</id> <name>SpringSource Repository</name> <url>http://repo.spring.io/release/</url> </repository>
<repository> <id>central-repos</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> </repository>
<repository> <id>central-repos1</id> <name>Central Repository 2</name> <url>http://repo1.maven.org/maven2/</url> </repository>
<repository> <id>activiti-repos</id> <name>Activiti Repository</name> <url>https://maven.alfresco.com/nexus/content/groups/public</url> </repository>
经过<repositories></repositories>配置库,这样配置的库仅适用于当前项目。
repositorie的主要参数
属性 | 描述 |
---|---|
id | 库的ID |
url | 库的URL |
releases | 是否启用releases Release版本则表明稳定的版本,发行版本 |
snapshots | 是否启用snapshots Snapshot版本表明不稳定、尚处于开发中的版本,快照版本 |
样例:
<repositories> <repository> <id>aliyunmaven</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
项目在向仓库推送构件或者拉取构件时,有些仓库须要认证,故须要为指定仓库id配置 认证信息
在settings.xml中配置认证信息
<servers> <server> <id>ossrh</id> <username>qwerwer</username> <password>asdfasdfasdfe2234dsed+23sdfsfaseafd</password> </server> </servers>
在一些较大的项目中,咱们一般须要将项目合理的拆分红多个不一样的子模块,以便于统一的配置管理,代码复用,方便程序的维护与开发。
父模块必须使用 pom 的方式打包以下:
<packaging>pom</packaging>
在父模块中定义要管理的子模块
<modules> <module>childA</module> <module>childB</module> </modules>
在maven父子关系中,子项目会集成父类大部分配置的。对于咱们在项目中须要使用的构件,咱们可使用两种方式来引入:
由于继承关系,两种方式引入的构件,均可以用来在子项目中使用,但用法有区别,也有各自的优点。
使用dependencies在父pom中引入构件,此种方式引入的jar能够在全部子模块中使用,使用相同配置,并不须要从新引用,适用于共用构件,举个 :
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies>
使用dependencymanagement在父pom中引入构件,此种方式引入的jar,若子模块须要使用,则须要从新在<dependencies>标签中使用,父类提供统一的版本控制,举个 :
<dependencyManagement> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
使用maven中,最让咱们头疼的就是jar包的版本,构件以前相互嵌套,不一样版本相互依赖,不相兼容,会致使咱们在开发中遇到不少奇奇怪怪的问题。
了解版本控制,能够帮咱们在遇到麻烦时,快速定位问题。
Maven使用groupId(通常是组织的域名倒写)+ artifactId(库自己的名称) + version(版本)来定义坐标,经过xml来作配置文件。
Maven我会在后面的笔记中,手把手教您一步步上传本身的项目到maven中央仓库
Maven 在 pom.xml 中引入jar包,当Maven解析该依赖时,还须要引入该依赖pom中所依赖的构件以及构件中依赖的构件。这必然会形成同一构件的不用版本同时出如今项目中。
A -> B -> C -> D(V1) F -> G -> D(V2)
若某项目想使用构件D,并存在以上依赖关系时,优先使用D(V2),其暴露深度更短。
若是A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度同样怎么办呢?这样的状况下,maven会根据pom文件声明的顺序加载,若是先声明了B,后声明了C,那就最后的依赖就会是X(1.0)。
子pom内声明的优先于父pom中的依赖。
咱们在项目中,可使用 <exclusions>标签来过滤掉不须要的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
举个 :
<properties> <spring-framework-version>4.3.7.REALEASE</spring-framework-version> </properties>
在引入依赖时使用:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-framework-version}</version> <scope>compile</scope> </dependency>
更多好玩好看的内容,欢迎到个人博客交流,共同进步 WaterMin
喜欢听相声的朋友,也能够来个人 YouTube,来听郭老师的相声 秋酿