Web-第二十五天 Maven学习一【悟空教程】
项目管理工具Maven
解决方案:maven对项目生命周期进行定义,规范,开发人员和测试人员使用maven软件完成构建。
解决方案:maven提供对项目依赖的第三方构件统一管理,通过规范的依赖管理来管理依赖的jar包。
解决方案:maven对每个模块构建成一个一个独立的工程,每个模块构建成功将打成 jar包发布到maven远程仓库,工程师每次运行工程只需要从仓库下载模块jar包即可不用对全部源代码进行编译。
Maven是Apache下的一个开源项目,它是一个项目管理工具,同时也是一个项目构建工具,它用于对java项目进行项目构建、依赖管理及项目信息管理。当前使用Maven的项目在持续增长。
Maven包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
通过pom.xml定义项目的坐标、项目依赖、项目信息、插件目标等。
通过定义项目所依赖组件的坐标由maven进行依赖管理。
比如:项目依赖struts2.3.24,通过在pom.xml中定义依赖即可将struts2的jar包自动加入工程:
pom.xml中定义依赖如下:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
</dependency>
一个软件开发人员每天都在完成项目的生命周期:清理、编译、测试、部署,有的手工完成,有的通过Ant(也是一个项目构建工具)脚本自动完成,Maven将项目生命周期抽象统一为:清理、初始化、编译、测试、报告 、打包、部署、站点生成等。
maven就是要保证一致的项目构建流程,通过执行一些简单命令即可实现上边生命周期的各各过程。
maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。
maven 管理项目生命周期过程都是基于插件完成的。
使用maven需要配置仓库,仓库的作用就是管理依赖(jar包)。
Maven的仓库类型有两种:
1.本地仓库:
指的是本地磁盘目录,用来存储从远程仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。
注意:默认本地仓库位置在 ${user.dir}/.m2/repository,${user.dir}表示windows用户目录。
2.远程仓库:
如果工程需要插件或者jar包,本地仓库没有,则去远程仓库下载。
a) 中央仓库
中央仓库地址:http://repo1.maven.org/maven2
它是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。
b) 私服
私服是搭建在公司内部的一个远程仓库,它可以管理公司内部的工程依赖及中央仓库的依赖。
下载网址: http://maven.apache.org/download.cgi
本教程使用3.3.9 版本
安装maven之前,需要安装jdk(maven是使用java开发的)
第一步:将maven的压缩包apache-maven-3.3.9-bin.zip解压。
注意:解压时,不要解压到带有中文或者空格的目录下。
bin目录 :mvn.bat (以run方式运行项目)、 mvnDebug.bat(以debug方式运行项目 )
boot目录 :maven运行需要类加载器
conf目录 :settings.xml 整个maven工具核心配置文件
lib目录 :maven运行依赖jar包
第二步:配置环境变量MAVEN_HOME
第三步:配置环境变量PATH
第四步:测试maven是否安装成功
默认本地仓库位置在 ${user.dir}/.m2/repository,${user.dir}表示windows用户目录,如下
可以修改本地仓库地址,有两种方式:
1.修改全局配置文件
文件位置:%MAVEN_HOME%\conf\settings.xml
2.修改用户配置文件(默认该文件是没有的)
文件位置:${user.dir}\.m2\settings.xml
注意:如果有用户配置文件,则用户配置文件优先。
修改localRepository标签,如果设置用户配置文件,则全局配置文件失效。
注意:本地仓库的依赖,需要联网下载,如果没有网络,则使用本教程提供的repository.rar,将repository.rar解压至自己的本地仓库位置。
比如我的本地仓库地址:
M2E插件是在Eclipse中安装,增强Eclipse功能。 本教程使用Eclipse mars2,此版本自带maven插件不用单独安装。
检查Eclipse中是否安装maven的方式如下:
在新建窗口中可看到maven项目的创建项:
一些高版本的eclipse已经内置了maven的安装,下图是STS 3.7版本内置了maven3.3.3版本,不过通常情况下,项目为了统一maven版本而不使用内置的maven,需要单独指定本地安装的maven,本教程使用本机安装的maven3.3.9。
maven仓库地址、私服等配置信息需要在setting.xml文件中配置。在maven安装目录下的有 conf/setting.xml文件,此setting.xml文件用于maven的所有project项目,它作为maven的全局配置。
如果用户需要特殊的maven配置则需要对setting.xml自定义,用户setting.xml的默认的位置在:${user.dir} /.m2/settings.xml目录中,${user.dir} 指windows 中的用户目录。
本教程统一使用maven安装目录下的用户setting.xml。
注意:如果修改了 setting.xml文件需要点击上图中的“update settings”按钮对本地仓库重建索引,点击“Reindex”。
打开eclipse仓库视图,对插件和jar包建立索引
使用maven管理项目的构建过程,比如编译、测试、打包、部署等操作。
新建一个maven工程:maven_first
注意:如果不选择create a simple project选项,则需要去联网下载maven工程的骨架。
maven内置了一些maven项目的骨架快速创建项目,使用quickstart 骨架,创建简单java工程。
定义groupId、artifactId、version:
groupId:定义当前maven项目名称,为了和互联网上其它项目区别需要使用域名倒序
artifactId:定义当前maven项目的模块名称
version:定义当前项目的当前版本,常用的版本类型包括:snapshot快照版、release正式发布版
Maven本身对于工程结构是有约束的。
完整的目录结构如下:
Project
|--src/main/java —— 存放项目的.java文件
|--src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
|--src/test/java —— 存放所有测试.java文件,如JUnit测试类
|--src/test/resources —— 测试资源文件
|--Maven dependenties —— maven工程依赖的jar
|--src/main —— web工程存储jsp、js等,相当于WebRoot
|--target ——项目构建输出目录
|--pom.xml ——每个maven工程都有一个pom.xml
创建成功目录结构不全需要补充:
本教程 使用jdk1.7,设置maven编译版本为1.7
在pom.xml中的project标签下加入:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
执行update:
执行update后查看jar版本为1.7:
完整的Maven的命令:mvn test(插件名称)
在Eclipse中,执行maven命令时,不需要编写mvn
使用run as或debug as来执行maven命令。
Run as 采用 mvn 命令运行 ,Debug as 采用 mvnDebug 命令调试方式运行(可打断点)
Maven clean 清理target目录
Maven test 执行单元测试
Maven install将工程打包后发布到本地仓库
Maven build 使用之前操作过的命令
Maven build … 手动输入命令内容,如下图:
n 编译命令 mvn compile
编译后 .class文件在 target/classes 下 (这个命令只会对java源程序编译, 不会编译测试代码 , 编译测试类 mvn test-compile , 编译后.class 文件在 target\test-classes )
执行所有测试用例方法, 重新编译
清除target目录 (清除所有编译结果或者打包结果 ),清理后编译。
java项目生成 jar包, web项目生成war包
默认生成jar包名称 : artifactId-version.jar
将工程打包后发布到本地仓库
---- 安装到仓库/groupId/artifactId/version 目录
cmd进入工程目录执行maven命令需要加前缀mvn。
注意:进入工程目录,当前目录下必须有pom.xml方可执行。
如果setting.xml中本地仓库不配置或配置错误,由于仓库中不包括创建工程所使用的插件包会自动从互联网下载:
配置本教程 提供的本地仓库,由于仓库中有插件包不再从互联网下载:
pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,基本配置如下:
<project > :文件的根节点 . <modelversion > : pom.xml使用的对象模型版本 <groupId > :公司名称,一般写公司的域名 <artifactId > :项目名称 <version > :产品的版本号 .
<packaging > :打包类型,一般有jar、war、pom 等 <name > :项目的显示名,常用于 Maven 生成的文档。 <description > :项目描述,常用于 Maven 生成的文档
<dependencies> :项目依赖构件配置,配置项目依赖构件的坐标
<build> :项目构建配置,配置编译、运行插件等。
POM即项目对象模型 (Project Object Model),在POM中定义项目依赖的坐标、项目信息、项目构建等配置,一个pom.xml文件定义了一个Maven项目。
POM中包含了四类描述和配置,如下图:
第一部分: POM Relationships 关系
Coordinates 坐标: 在仓库中唯一标识项目位置三个参数
<groupId> 公司名称
<artifactId> 项目名称
<version> 版本号
三种关系:
Aggregation 聚合(多模块) : 将项目分解为多个不同模块
Inheritance 继承 : 项目之间继承,实现POM复用
Dependencies 依赖: 项目依赖另一个项目进行编译或者运行
第二部分: Project Information 项目信息
name :项目名称
desciption: 项目描述
第三部分: Build settings 构建配置
properties : 配置属性
build :构建项目需要插件配置
packaging :打包方式 jar、war、pom
reporting : 报表
第四部分: Build Environment 构建环境 (在依赖、构建、运行 生效配置 )
DependenciesManagement :版本锁定
Profile : 灵活自定义配置,在特定情况激活
软件开发人员每天都在对项目进行清理、编译、测试、部署,maven对所有构建过程进行抽象和统一,Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
每个生命周期都包括一些阶段(phase),这些阶段是有顺序的,后面的阶段依赖前边的阶段,每个阶段都有对应的maven命令,用户通过执行这些命令执行这些阶段,例如:
mvn clean 该命令调用clean生命周期的clean阶段,最终会执行pre-clean和clean两个阶段。
mvn test 该命令调期default生命周期的test阶段,最终会执行validate、compile等直到test的所有阶段。
注意:执行某个生命周期的某个阶段不会影响其它的生命周期!
如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,例如:
clean package 该命令执行clean生命周期的clean阶段和default生命周期的package阶段。
解决方案:maven提供对项目依赖的第三方构件统一管理,通过规范的依赖管理来管理依赖的jar包。
解决方案:maven提供对项目依赖的第三方构件统一管理,通过规范的依赖管理来管理依赖的jar包的版本。
这里基于maven的方式创建一个web工程。
本工程最终要打包war包发布,这里选择骨架webapp
在src\main\webapp目录下,创建WEB-INF目录,然后创建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
</web-app>
参考创建java工程部分
在pom.xml中引入servlet的坐标依赖,注意scop调为provided:
<dependencies>
<!-- servlet jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
maven通过坐标定义每一个构件,在pom.xml中定义坐标:
groupId:定义当前Maven公司名称
artifactId:定义项目名称
version:定义当前项目的当前版本
http://search.maven.org/
http://mvnrepository.com/
网站搜索示例:
在maven-web的pom.xml中定义dependency标签,导入junit的依赖
在maven-web中导入maven-first的依赖
<dependency>
<groupId>cn.com.javahelp.yycg</groupId>
<artifactId>maven-first</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
查看工程中已添加maven-first的依赖:
在代码中使用maven-first依赖中的User类,
public class App {
public static void main(String[] args) {
User user = new User();
}
}
在maven-web中通过eclipse导入struts2-spring的依赖:
即项目中的jar包所能影响的范围,其中范围指的是:main目录、test目录、war包。
默认的依赖范围就是compile。
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
只需要关注provided依赖范围就可以。
依赖范围由强到弱的顺序是:compile>provided>runtime>test
A 依赖B、B依赖C,则A中自动导入C。C是A的传递依赖,如果C依赖D则D也是A的传递依赖。
测试:
加入 struts2-spring-plugin 的依赖,如下:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
struts2-spring-plugin依赖struts和spring,基于传递依赖的原理,工程会自动添加struts和spring的依赖。
测试结果如下:
依赖会有依赖范围,依赖范围对传递依赖也有影响,有A、B、C三个过程,A依赖B、B依赖C,C可能是A的传递依赖,如下图:
最左边一列为直接依赖,理解为A依赖B的范围,最顶层一行为传递依赖,理解为B依赖C的范围,行与列的交叉即为A传递依赖C的范围。
举例:
比如 A对 B 有 compile 依赖,B 对C有 runtime 依赖,那么根据表格所示A对C 有 runtime 依赖。
总结:
每个单元格都对应行列中最弱的那个,当 p1 依赖 p2,p2 依赖 p3……,最终,p1 传递依赖了pn 的时候,p1 对 pn 的依赖性取决于依赖链中最弱的一环。
测试:
maven-first依赖junit,scope为test
maven-web依赖maven-first.
查看下图红色框内所示传递依赖范围:
所以maven-first所依赖的junit的jar没有加入到maven-web工程。
如果修改maven-first依赖junit的scope为compile,maven-first所依赖的junit的jar包会加入到maven-web工程中,符合上边表格所示,查看下图红色框内所示:
当一个项目依赖的构件比较多时,它们相互之间存在依赖,当你需要对依赖版本统一管理时如果让maven自动来处理可能并不能如你所愿,如下例子:
同时加入以下依赖,观察依赖:
<!-- struts2-spring-plugin依赖spirng-beans-3.0.5 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> </dependency> <!-- spring-context依赖spring-beans-4.2.4 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> |
---|
org.apache.struts依赖spirng-beans-3.0.5,spring-context依赖spring-beans-4.2.4,但是发现spirng-beans-3.0.5加入到工程中,而我们希望spring-beans-4.2.4加入工程。
maven自动按照下边的原则调解:
例如:A-> spirng-beans-4.2.4,A->B-> spirng-beans-3.0.5,则spirng-beans-4.2.4优先
测试:
在maven-first工程中的pom中加入spirng-beans-4.2.4的依赖,根据路径近者优先原则,系统将导入spirng-beans-4.2.4:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
如果路径一致,则按照第二原则进行依赖调解。
在pom文件中谁先声明以谁为准。
测试:
如果将上边struts-spring-plugins和spring-context顺序颠倒,系统将导入spring-beans-4.2.4。
可以通过排除依赖方法辅助依赖调解:
比如struts2-spring-plugin中添加排除spring-beans:
<!-- struts2-spring-plugin依赖spirng-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<!-- 排除 spring-beans-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
则最终的依赖版本为4.2.4.
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,此方法在企业开发中常用:
使用dependencyManagement标签来进行锁定版本。
注意:dependencyManagement标签只是对版本进行锁定,没有进行真实依赖。
<dependencyManagement>
<dependencies>
<!--这里锁定版本为4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
解决方案:项目组将写的工具类通过maven构建,打成jar,将jar包发布到公司的maven仓库中,公司其它项目通过maven依赖管理从仓库自动下载jar包。
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
私服还充当一个代理服务器,当私服上没有jar包会从互联网中央仓库自动下载,如下图:
Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。
下载Nexus, 下载地址:http://www.sonatype.org/nexus/archived/
下载:nexus-2.12.0-01-bundle.zip
第一步:将nexus-2.12.0-01-bundle.zip解压
第二步:安装nexus服务
进入nexus-2.12.0-01\bin目录,然后使用nexus.bat命令进行操作
命令:nexus.bat install
出现问题:
原因:需要以管理员身份运行。
使用管理员运行之后,安装服务成功。
第三步:启动nexus服务
方式1.直接启动nexus服务
方式2:使用命令启动
Nexus.bat start
出现问题:
查看wrapper.log
解决方案:
修改nexus-2.12.0-01\bin\jsw\conf目录下的wrapper.conf文件
第四步:访问nexus
地址:http://localhost:8081/nexus
点击右上角的login,可以登录
用户名:admin
密码:admin123
cmd进入nexus的bin目录,执行:nexus.bat uninstall
查看window服务列表nexus已被删除。
方法1:
cmd进入bin目录,执行nexus.bat start
方法2:
直接启动nexus服务
查看nexus的配置文件conf/nexus.properties
# Jetty section
application-port=8081 # nexus的访问端口配置
application-host=0.0.0.0 # nexus主机监听配置(不用修改)
nexus-webapp=${bundleBasedir}/nexus # nexus工程目录
nexus-webapp-context-path=/nexus # nexus的web访问路径
# Nexus section
nexus-work=${bundleBasedir}/../sonatype-work/nexus # nexus仓库目录
runtime=${bundleBasedir}/nexus/WEB-INF # nexus运行程序目录
访问:http://localhost:8081/nexus/
使用Nexus 内置账户admin/admin123登陆:
点击右上角的Log in,输入账号和密码 登陆
登陆成功:
注意:如果使用命令行启动失败,则查看wrapper.log日志文件
出现问题:Unable to execute Java command. 系统找不到指定的文件
解决方案:修改wrapper.conf文件
nexus的仓库有4种类型:
1. hosted,本地仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
2. proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
3. group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
4. virtual(虚拟):兼容Maven1 版本的jar或者插件
nexus仓库默认在sonatype-work目录中:
存储snapshots构件,代理地址https://repository.apache.org/snapshots/
私服可以作为代理仓库,比如代理中央仓库,通过私服可以搜索中央仓库中的构件, nexus提供搜索中央仓库构件的功能,比如:输入junit可以搜索出所有junit的版本。
nexus是基于全文检索技术搜索构件,全文检索需要索引文件才可搜索,首先需要创建索引,创建索引方法如下:
1.自动下载
将central 中央仓库自动创建索引开关打开,这样nexus自动可以从中央仓库下载索引文件。
执行:
update index
2.手动下载(了解)
从中央仓库下载索引,手动拷贝到nexus工作目录。
下载地址:http://repo.maven.apache.org/maven2/.index/
下载如下文件:
从网上下载:indexer-cli-5.1.0.jar
将这三者放在一个文件夹,cmd执行:
Cmd命令:java -jar indexer-cli-5.1.0.jar -u nexus-maven-repository-index.gz -d indexer
会自动在本目录生成索引文件目录,如下图:
将上图的索引文件目录拷贝至:sonatype-work\nexus\indexer\central-ctx
重启nexus:
索引创建完毕,进入nexus界面搜索构件:
查看构件的坐标:
企业中多个团队协作开发通常会将一些公用的组件、开发模块等发布到私服供其它团队或模块开发人员使用。
第一步: 需要在客户端 %MAVEN_HOME%\conf\ settings.xml 配置连接私服的用户和密码
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
releases 连接发布版本项目仓库
snapshots 连接测试版本项目仓库
第二步: 配置项目pom.xml
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意:pom.xml这里<id> 和 settings.xml 配置 <id> 对应!
第三步: 将项目发布到私服 mvn deploy 命令
1.首先启动nexus
2.将项目发布到nexus,执行deploy
根据本项目pom.xml中version定义决定发布到哪个仓库,如果version定义为snapshot,执行deploy后查看nexus的snapshot仓库,如果version定义为release则项目将发布到nexus的release仓库,本项目将发布到snapshot仓库:
也可以通过http方式查看:
没有配置nexus之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,程序员连接私服从私服下载jar包,这样做的好处是一方面由私服对公司项目的依赖统一管理,一方面提高下载速度,毕竟局域网速度比公网快。
nexus中包括很多仓库,hosted中存放的是企业自己发布的或第三方的jar,proxy中存放的是中央仓库的jar,为了方便从私服下载jar包可以将多个仓库组成一个仓库组,项目通过连接nexus的仓库组下载jar包。
打开nexus配置仓库组:
上图中仓库组包括了本地仓库、代理仓库等。
在项目的pom.xml中配置依赖构件仓库和插件仓库,并将仓库的地址指向私服地址即可。
<repositories>
<repository>
<!-- 构件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
配置成功后查看有效pom的内容如下:
有两个仓库地址,maven会先从前边的仓库的找,如果找不到jar包再从下边的找,从而就实现了从私服下载jar包。
<repositories>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</repository>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</pluginRepository>
</pluginRepositories>
测试:
项目pom.xml添加依赖一个本地仓库和私服都没有jar包,maven先从本地仓库找,本地仓库没有再从私服找,私服没有再去中央仓库下载,下载成功jar在私服、本地仓库分别存储一份。
上边的方法是在项目的pom.xml中配置仓库地址,这样每个项目都要配置,可以在setting.xml中配置仓库所有项目公用,由于setting.xml中没有repositories的配置标签需要使用profile定义仓库。
<profile>
<!--profile的id-->
<id>dev</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复-->
<id>nexus</id>
<!--仓库地址,即nexus仓库组的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!--是否下载releases构件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载snapshots构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
使用profile定义仓库需要激活才可生效。
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
<mirrors> <mirror> <!--此处配置所有的构件均从私有仓库中下载 *代表所有构件下载的服务id,也可以写central ,central是中央仓库的服务器ID--> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public/</url> </mirror> </mirrors> |
---|