前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web-第二十五天 Maven学习一【悟空教程】

Web-第二十五天 Maven学习一【悟空教程】

作者头像
Java帮帮
发布2018-07-27 15:08:09
发布2018-07-27 15:08:09
9350
举报

Web-第二十五天 Maven学习一【悟空教程】

项目管理工具Maven

1 maven介绍

1.1 项目开发中的问题及解决方案

  • 问题1:开发人员将功能开发完成,编译、打包、运行正常,而后提交svn,测试人员从svn获取代码后编译、打包、运行报错。

解决方案:maven对项目生命周期进行定义,规范,开发人员和测试人员使用maven软件完成构建。

  • 问题2:一个项目工程中时间长了开发人员也搞不清楚项目中的某些jar的作用,用在哪些模块,不得不每过一段时间对每个jar包梳理一遍搞清楚每个jar包被哪些模块依赖。

解决方案:maven提供对项目依赖的第三方构件统一管理,通过规范的依赖管理来管理依赖的jar包。

  • 问题3:项目的模块很多,每次启动项目需要从svn获取全部模块的项目代码编译运行,由于工程大项目启动慢,工作效率低下。

解决方案:maven对每个模块构建成一个一个独立的工程,每个模块构建成功将打成 jar包发布到maven远程仓库,工程师每次运行工程只需要从仓库下载模块jar包即可不用对全部源代码进行编译。

1.2 maven的概念模型

Maven是Apache下的一个开源项目,它是一个项目管理工具,同时也是一个项目构建工具,它用于对java项目进行项目构建、依赖管理及项目信息管理。当前使用Maven的项目在持续增长。

Maven包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

  • 项目对象模型 (Project Object Model)

通过pom.xml定义项目的坐标、项目依赖、项目信息、插件目标等。

  • 依赖管理系统(Dependency Management System)

通过定义项目所依赖组件的坐标由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>

  • 一个项目生命周期(Project Lifecycle)

一个软件开发人员每天都在完成项目的生命周期:清理、编译、测试、部署,有的手工完成,有的通过Ant(也是一个项目构建工具)脚本自动完成,Maven将项目生命周期抽象统一为:清理、初始化、编译、测试、报告 、打包、部署、站点生成等。

maven就是要保证一致的项目构建流程,通过执行一些简单命令即可实现上边生命周期的各各过程。

  • 一组标准集合

maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

  • 插件(plugin)目标(goal)

maven 管理项目生命周期过程都是基于插件完成的。

1.3 maven的仓库

使用maven需要配置仓库,仓库的作用就是管理依赖(jar包)。

Maven的仓库类型有两种:

1.本地仓库:

指的是本地磁盘目录,用来存储从远程仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。

注意:默认本地仓库位置在 ${user.dir}/.m2/repository,${user.dir}表示windows用户目录。

2.远程仓库:

如果工程需要插件或者jar包,本地仓库没有,则去远程仓库下载。

a) 中央仓库

中央仓库地址:http://repo1.maven.org/maven2

它是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。

b) 私服

私服是搭建在公司内部的一个远程仓库,它可以管理公司内部的工程依赖及中央仓库的依赖。

2 maven安装与配置

2.1 下载

下载网址: http://maven.apache.org/download.cgi

本教程使用3.3.9 版本

2.2 安装

安装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是否安装成功

  • 解压不含有中文和空格的目录

2.3 本地仓库配置

默认本地仓库位置在 ${user.dir}/.m2/repository,${user.dir}表示windows用户目录,如下

可以修改本地仓库地址,有两种方式:

1.修改全局配置文件

文件位置:%MAVEN_HOME%\conf\settings.xml

2.修改用户配置文件(默认该文件是没有的)

文件位置:${user.dir}\.m2\settings.xml

注意:如果有用户配置文件,则用户配置文件优先。

修改localRepository标签,如果设置用户配置文件,则全局配置文件失效。

注意:本地仓库的依赖,需要联网下载,如果没有网络,则使用本教程提供的repository.rar,将repository.rar解压至自己的本地仓库位置。

比如我的本地仓库地址:

2.4 m2e插件安装配置

2.4.1 插件安装

M2E插件是在Eclipse中安装,增强Eclipse功能。 本教程使用Eclipse mars2,此版本自带maven插件不用单独安装。

检查Eclipse中是否安装maven的方式如下:

在新建窗口中可看到maven项目的创建项:

2.4.2 指定maven安装目录

一些高版本的eclipse已经内置了maven的安装,下图是STS 3.7版本内置了maven3.3.3版本,不过通常情况下,项目为了统一maven版本而不使用内置的maven,需要单独指定本地安装的maven,本教程使用本机安装的maven3.3.9。

2.4.3 User Setting配置

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”。

2.4.4 eclipse浏览仓库

打开eclipse仓库视图,对插件和jar包建立索引

3 Maven项目构建

3.1 需求

使用maven管理项目的构建过程,比如编译、测试、打包、部署等操作。

3.2 创建maven工程(java工程)

3.2.1 第一步:新建一个maven工程

新建一个maven工程:maven_first

注意:如果不选择create a simple project选项,则需要去联网下载maven工程的骨架。

3.2.2 第二步:选择骨架

maven内置了一些maven项目的骨架快速创建项目,使用quickstart 骨架,创建简单java工程。

3.2.3 第三步:定义坐标

定义groupId、artifactId、version:

groupId:定义当前maven项目名称,为了和互联网上其它项目区别需要使用域名倒序

artifactId:定义当前maven项目的模块名称

version:定义当前项目的当前版本,常用的版本类型包括:snapshot快照版、release正式发布版

3.2.4 第四步:maven工程目录

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

创建成功目录结构不全需要补充:

3.2.5 第五步:设置编译版本

本教程 使用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:

3.2.6 第六步:测试maven命令(eclipse下)

完整的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 )

  • 测试命令 mvn test

执行所有测试用例方法, 重新编译

  • 清除命令 mvn clean

清除target目录 (清除所有编译结果或者打包结果 ),清理后编译。

  • 打包命名 mvn package

java项目生成 jar包, web项目生成war包

默认生成jar包名称 : artifactId-version.jar

  • 安装命令 mvn install

将工程打包后发布到本地仓库

---- 安装到仓库/groupId/artifactId/version 目录

3.2.7 第六步:测试maven命令(命令行下)

cmd进入工程目录执行maven命令需要加前缀mvn。

注意:进入工程目录,当前目录下必须有pom.xml方可执行

3.2.8 注意本地仓库的配置

如果setting.xml中本地仓库不配置或配置错误,由于仓库中不包括创建工程所使用的插件包会自动从互联网下载:

配置本教程 提供的本地仓库,由于仓库中有插件包不再从互联网下载:

3.3 pom基本配置(重点)

pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,基本配置如下:

<project > :文件的根节点 . <modelversion > : pom.xml使用的对象模型版本 <groupId > :公司名称,一般写公司的域名 <artifactId > :项目名称 <version > :产品的版本号 .

<packaging > :打包类型,一般有jar、war、pom 等 <name > :项目的显示名,常用于 Maven 生成的文档。 <description > :项目描述,常用于 Maven 生成的文档

<dependencies> :项目依赖构件配置,配置项目依赖构件的坐标

<build> :项目构建配置,配置编译、运行插件等。

3.4 pom详细配置(了解)

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 : 灵活自定义配置,在特定情况激活

3.5 项目生命周期(了解)

软件开发人员每天都在对项目进行清理、编译、测试、部署,maven对所有构建过程进行抽象和统一,Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle 生成项目报告,站点,发布站点。

3.5.1 生命周期clean

clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  • pre-clean 执行一些需要在clean之前完成的工作
  • clean 移除所有上一次构建生成的文件
  • post-clean 执行一些需要在clean之后立刻完成的工作

mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。

3.5.2 生命周期default

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 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

3.5.3 生命周期site

  • Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作
  • site 生成项目的站点文档
  • post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy 将生成的站点文档部署到特定的服务器上

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。

3.5.4 命令与生命周期

每个生命周期都包括一些阶段(phase),这些阶段是有顺序的,后面的阶段依赖前边的阶段,每个阶段都有对应的maven命令,用户通过执行这些命令执行这些阶段,例如:

mvn clean 该命令调用clean生命周期的clean阶段,最终会执行pre-clean和clean两个阶段。

mvn test 该命令调期default生命周期的test阶段,最终会执行validate、compile等直到test的所有阶段。

注意:执行某个生命周期的某个阶段不会影响其它的生命周期!

如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,例如:

clean package 该命令执行clean生命周期的clean阶段和default生命周期的package阶段。

4 Maven依赖管理

4.1 需求

  • 问题1:一个项目工程中时间长了开发人员也搞不清楚项目中的某些jar的作用,用在哪些模块,不得不每过一段时间对每个jar包梳理不遍。

解决方案:maven提供对项目依赖的第三方构件统一管理,通过规范的依赖管理来管理依赖的jar包。

  • 问题2:项目使用的第三方框架要升级,从第三方框架官方网站下载jar包,加入工程,运行后报错,原来是第三方框架依赖的jar版本冲突了。

解决方案:maven提供对项目依赖的第三方构件统一管理,通过规范的依赖管理来管理依赖的jar包的版本。

4.2 创建maven web工程

这里基于maven的方式创建一个web工程。

4.2.1 第一步:创建maven工程

4.2.2 第二步:选择非骨架方式

本工程最终要打包war包发布,这里选择骨架webapp

4.2.3 第三步:定义坐标

4.2.4 第四步:添加web.xml

在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>

4.2.5 第五步:设置编译版本

参考创建java工程部分

4.2.6 第六步:加入servlet/jsp依赖

在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>

4.3 坐标管理

4.3.1 坐标定义

maven通过坐标定义每一个构件,在pom.xml中定义坐标:

groupId:定义当前Maven公司名称

artifactId:定义项目名称

version:定义当前项目的当前版本

4.3.2 查找坐标(重点)

  • 方法一:从互联网搜索

http://search.maven.org/

http://mvnrepository.com/

网站搜索示例:

  • 方法二:使用maven插件的索引功能

4.4 依赖管理

4.4.1 添加依赖

4.4.1.1 通过坐标导入依赖
  • 例子1:

在maven-web的pom.xml中定义dependency标签,导入junit的依赖

  • 例子2:

在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();

}

}

  • 例子3:

在maven-web中通过eclipse导入struts2-spring的依赖:

4.4.1.2 依赖范围scope

即项目中的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

4.4.2 传递依赖

4.4.2.1 什么是传递依赖

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的依赖。

测试结果如下:

4.4.2.2 依赖范围对传递依赖的影响(了解)

依赖会有依赖范围,依赖范围对传递依赖也有影响,有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工程中,符合上边表格所示,查看下图红色框内所示:

4.4.3 依赖版本冲突解决

4.4.3.1 问题

当一个项目依赖的构件比较多时,它们相互之间存在依赖,当你需要对依赖版本统一管理时如果让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加入工程。

4.4.3.2 依赖调解原则

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。

4.4.3.3 排除依赖

可以通过排除依赖方法辅助依赖调解:

比如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.

4.4.3.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>

5 maven私服

5.1 需求

  • 问题1:项目组编写了一个通用的工具类,其它项目组将类拷贝过去使用,当工具类修改bug后通过邮件发送给各各项目组,这种分发机制不规范可能导致工具类版本不统一。

解决方案:项目组将写的工具类通过maven构建,打成jar,将jar包发布到公司的maven仓库中,公司其它项目通过maven依赖管理从仓库自动下载jar包。

5.2 分析

公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。

私服还充当一个代理服务器,当私服上没有jar包会从互联网中央仓库自动下载,如下图:

5.3 搭建私服环境

5.3.1 下载nexus

Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。

下载Nexus, 下载地址:http://www.sonatype.org/nexus/archived/

下载:nexus-2.12.0-01-bundle.zip

5.3.2 安装nexus

第一步:将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

5.3.3 卸载nexus

cmd进入nexus的bin目录,执行:nexus.bat uninstall

查看window服务列表nexus已被删除。

5.3.4 启动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文件

5.4 私服仓库类型

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目录中:

  • central:代理仓库,代理中央仓库
  • apache-snapshots:代理仓库

存储snapshots构件,代理地址https://repository.apache.org/snapshots/

  • central-m1:virtual类型仓库,兼容Maven1 版本的jar或者插件
  • releases:本地仓库,存储releases构件。
  • snapshots:本地仓库,存储snapshots构件。
  • thirdparty:第三方仓库
  • public:仓库组

5.5 使用私服

5.5.1 搜索构件

私服可以作为代理仓库,比如代理中央仓库,通过私服可以搜索中央仓库中的构件, nexus提供搜索中央仓库构件的功能,比如:输入junit可以搜索出所有junit的版本。

5.5.1.1 创建索引

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:

5.1.1.1 搜索构件

索引创建完毕,进入nexus界面搜索构件:

查看构件的坐标:

5.5.2 将项目发布到私服

企业中多个团队协作开发通常会将一些公用的组件、开发模块等发布到私服供其它团队或模块开发人员使用。

第一步: 需要在客户端 %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方式查看:

5.5.3 从私服下载jar包

没有配置nexus之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,程序员连接私服从私服下载jar包,这样做的好处是一方面由私服对公司项目的依赖统一管理,一方面提高下载速度,毕竟局域网速度比公网快。

5.5.3.1 管理仓库组

nexus中包括很多仓库,hosted中存放的是企业自己发布的或第三方的jar,proxy中存放的是中央仓库的jar,为了方便从私服下载jar包可以将多个仓库组成一个仓库组,项目通过连接nexus的仓库组下载jar包。

打开nexus配置仓库组:

上图中仓库组包括了本地仓库、代理仓库等。

5.5.3.2 在pom.xml中配置私服仓库

在项目的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在私服、本地仓库分别存储一份。

5.5.3.3 在setting.xml中配置仓库

上边的方法是在项目的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>

5.5.3.4 在本地仓库的setting.xml中配置下载镜像,如下:

<mirrors> <mirror> <!--此处配置所有的构件均从私有仓库中下载 *代表所有构件下载的服务id,也可以写central ,central是中央仓库的服务器ID--> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public/</url> </mirror> </mirrors>

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 maven介绍
    • 1.1 项目开发中的问题及解决方案
    • 1.2 maven的概念模型
    • 1.3 maven的仓库
  • 2 maven安装与配置
    • 2.1 下载
    • 2.2 安装
    • 2.3 本地仓库配置
    • 2.4 m2e插件安装配置
      • 2.4.1 插件安装
      • 2.4.2 指定maven安装目录
      • 2.4.3 User Setting配置
      • 2.4.4 eclipse浏览仓库
  • 3 Maven项目构建
    • 3.1 需求
    • 3.2 创建maven工程(java工程)
      • 3.2.1 第一步:新建一个maven工程
      • 3.2.2 第二步:选择骨架
      • 3.2.3 第三步:定义坐标
      • 3.2.4 第四步:maven工程目录
      • 3.2.5 第五步:设置编译版本
      • 3.2.6 第六步:测试maven命令(eclipse下)
      • 3.2.7 第六步:测试maven命令(命令行下)
      • 3.2.8 注意本地仓库的配置
    • 3.3 pom基本配置(重点)
    • 3.4 pom详细配置(了解)
    • 3.5 项目生命周期(了解)
      • 3.5.1 生命周期clean
      • 3.5.2 生命周期default
      • 3.5.3 生命周期site
      • 3.5.4 命令与生命周期
  • 4 Maven依赖管理
    • 4.1 需求
    • 4.2 创建maven web工程
      • 4.2.1 第一步:创建maven工程
      • 4.2.2 第二步:选择非骨架方式
      • 4.2.3 第三步:定义坐标
      • 4.2.4 第四步:添加web.xml
      • 4.2.5 第五步:设置编译版本
      • 4.2.6 第六步:加入servlet/jsp依赖
    • 4.3 坐标管理
      • 4.3.1 坐标定义
      • 4.3.2 查找坐标(重点)
    • 4.4 依赖管理
      • 4.4.1 添加依赖
      • 4.4.2 传递依赖
      • 4.4.3 依赖版本冲突解决
  • 5 maven私服
    • 5.1 需求
    • 5.2 分析
    • 5.3 搭建私服环境
      • 5.3.1 下载nexus
      • 5.3.2 安装nexus
      • 5.3.3 卸载nexus
      • 5.3.4 启动nexus
    • 5.4 私服仓库类型
    • 5.5 使用私服
      • 5.5.1 搜索构件
      • 5.5.2 将项目发布到私服
      • 5.5.3 从私服下载jar包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档