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

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>

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

将Python脚本打包成可执行文件

本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstal...

1351
来自专栏武培轩的专栏

当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

当我们在浏览器的地址栏输入 www.cnblogs.com ,然后回车,回车到看到页面到底发生了什么呢? 域名解析 --> 发起TCP的3次握手 --> 建立T...

3547
来自专栏佳爷的后花媛

SVN命令解析以及问题解决(update...)

1.Repo-browser(浏览版本库) 通过“浏览版本库”可以直接查看服务器上指定目录下的所有目录结构(需要有相关权限),包括特定版本的作者,提交时间等,...

6393
来自专栏猛牛哥的博客

Centos安装简单易用的端口转发工具:rinetd

8175
来自专栏北京马哥教育

利用TCMalloc优化Nginx的性能

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Ma...

2295
来自专栏菩提树下的杨过

基于Spring的简易SSO设计

通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单...

2386
来自专栏应用案例

Hexo博客的安装部署及多电脑同步

Hexo安装教程很多,我这里尽可能的讲的细一些,把容易踩坑的地方以及后期多电脑同步所遇到的问题列出来,以便给自己及大家参考。本文主要讲解安装部署后源文件同步问题...

1.3K7
来自专栏猿份到

maven私服快速入门

android 开发时,类库依赖管理一般是拷贝到相应 libs 目录然后配置文件中引用该类库,或者引用 jceneter 中第三方类库等。 前者...

2918
来自专栏Crossin的编程教室

关于 Git 你不知道的十件事

git log -p FILE 查看README.md的修改历史,例如: > git log -p README.md git log -S’PATTERN’ ...

2565
来自专栏云计算教程系列

如何在Ubuntu 18.04上安装最新的MySQL

MySQL是一个着名的开源数据库管理系统,用于存储和检索各种流行应用程序的数据。MySQL是LAMP堆栈中的M,是一组常用的开源软件,也包括Linux,Apac...

2430

扫码关注云+社区