Maven入门教程(三)

Maven入门教程(三)

Maven 私服搭建

在本节中,我们来介绍一下如何使用 Nexus 来搭建我们自己的 Maven 私服。在之前的章节中,我们已经介绍过关于 Maven 仓库的分类了,就像下图张展示的那样子,今天,我们就重点的来讲一下关于私服这部分内容。

Maven入门教程(三)

1. Nexus 简介与安装

1.1 Nexus 简介

Nexus 的创始人是 Tamas Cservenak。在大约 2005 年的时候,Tamas 开始开发了一个 Proximity 系统,开发这个系统的原因是当时的电信公司提供的 ADSL 网络的传输速度过慢。Proximity 系统的目的也很明确,代理和缓存中央仓库中的构件,在 Maven 需要下载构件的时候,不需要经过糟糕的 ADSL 网络。后来,到了 2007 年的时候,Sonatype 团队邀请了 Tamas 创建了 Nexus 项目。

我们可以发现这又是一段类似 git 的产生的历史。大神们总是用这种方式,来改变着我们的历史。

1.2 Nexus 安装

接下来,我们来安装 Nexus 。首先,我们可以去 Sonatype 的官网上下载对应的 Nexus 版本。不过这里还是要吐槽一下这个地址的访问速度非常慢。这里,我们使用的是nexus-2.11.2-03-bundle.tar.gz版本。

  1. 首先,我们将安装包上传到服务器的对应目录中;
    Maven入门教程(三)
  2. 我们将安装包进行解压,执行命令tar -xvf nexus-2.11.2-03-bundle.tar.gz,解压后,对 nexus-2.11.2-03 目录进行重命名 mv nexus-2.11.2-03 nexus
    Maven入门教程(三)
  3. 编辑环境变量,vi /etc/profile,在文件的最后,根据自己服务器的情况,添加如下的配置;
    Maven入门教程(三)
  4. 进入到 bin 目录中,cd /usr/local/src/nexus/bin
  5. 在 bin 目录中,有 Nexus 的可执行文件,我们来执行 nohup ./nexus start &,来启动 Nexus,启动成功后,在浏览器中,输入http://ip:port/nexus可以浏览私服的网址;
    Maven入门教程(三)

至此,我们就安装好了 Nexus。

2. Nexus 配置与使用

2.1 Nexus 配置

接下来,我们来介绍如何配置 Nexus,来让其帮我们代理 Maven 的中央仓库。

  1. 首先,我们登陆 Nexus ,默认的密码是 admin/admin123,登陆成功后,我们可以看到左侧出现更多的功能;
    Maven入门教程(三)
  2. 如下图操作,我们来添加代理仓库;
    Maven入门教程(三)
  3. 在下方的配置页面,如下图进行操作;
    Maven入门教程(三)
  4. 创建好代理仓库之后,还需要配置一下 Public Repositories;
    Maven入门教程(三)
  5. 在配置好 Public Repositories 之后,我们更新一下该仓库的索引;
    Maven入门教程(三)
  6. 更新索引可能会需要一段时间,等到更新好之后,我们可以 Nexus 中搜索想要的构件,这时候说明 Nexus 的索引已经更新完成;
  7. Maven入门教程(三)

2.2 Nexus 使用

在配置好 Nexus 之后,我们要在项目中使用私服要如何使用呢?答案是,和使用其他的仓库没有太大区别。接下来,我们来具体介绍一下如何在项目中使用。

  1. 打开 Maven 的 setting.xml 文件,将其中的 mirrors 节点和 profiles 节点改为如下配置;<mirrors>
    <mirror>
    <id>mic-maven</id>
    <mirrorOf>*</mirrorOf>
    <name>mic maven</name>
    <url>http://ip:port/nexus/content/groups/public/</url>
    </mirror>
    </mirrors>
    <profiles>
    <profile>
    <id>maven profile</id>
    <activation>
    <jdk>1.8</jdk>
    <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
    <repository>
    <id>chenyao-central</id>
    <name>chenyao maven</name>
    <url>http://ip:port/nexus/content/groups/public/</url>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    </repository>
    </repositories>
    <pluginRepositories>
    <pluginRepository>
    <id>chenyao-central</id>
    <name>chenyao maven</name>
    <url>http://ip:port/nexus/content/groups/public/</url>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    </pluginRepository>
    </pluginRepositories>
    </profile>
    </profiles>
    <activeProfiles>
    <activeProfile>maven profile</activeProfile>
    </activeProfiles>在 setting.xml 文件中配置好 Nexus 之后,我们可以在项目中引入一个 jar 包来试一下,如果能够成功的将构件下载到本地,就说明我们的配置是正确的。

介于我们在团队内部使用的时候,还需要将项目的构建到 Nexus 中,所以,我们还需要进行单独的配置。

  1. 首先,我们在项目的 pom.xml 文件中,添加 distributionManagement 节点,用于控制分发管理;<distributionManagement>
    <repository>
    <id>mic-release</id>
    <name>mic maven</name>
    <url>http://ip:port/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
    <id>mic-snapshot</id>
    <name>mic maven</name>
    <url>http://ip:port/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
    </distributionManagement>
  2. 由于 Nexus 需要登陆才能使用,所以需要在 setting.xml 文件中配置服务器的登陆信息;<servers>
    <server>
    <id>mic-release</id>
    <username>admin</username>
    <password>admin123</password>
    </server>
    <server>
    <id>mic-snapshot</id>
    <username>admin</username>
    <password>admin123</password>
    </server>
    </servers>
  3. 配置完成后,我们在 mall-order目录下执行mvn clean deploy
  4. 执行完之后,我们去 Nexus 中根据坐标可以查到这个构件。
    Maven入门教程(三)

至此,我们已经能够让 Nexus 来代理中央仓库,并且将我们自己的项目构建到私服中去,来提供给其他的项目中使用。

3. 小结

在本节中,我们首先介绍了什么是 Nexus ,然后介绍了 Nexus 在服务器中的安装与配置方式,最后,我们将私服配置到我们的项目中去,让其供我们的项目使用。

4. FAQ

4.1 版本选择

本文中,我们选择的是 Nexus 的 2.x 版本,之所以这样做是因为,3.x 版本建议 CPU 核心数为 4 核,但是,我的服务器只是一个双核的,所以,被迫选择了 2.x 版本,3.x 版本和 2.x 版本理念上没有太多区别,只是具体配置操作可能会有差异。

4.2 RUN_AS_USER

Nexus 是不建议使用 root 用户来启动的。这里我们有两个选择,一个是单独创建一个用户,来提供 Nexus 使用(建议);另一种就是像本节中的配置,在环境变量中增加 RUN_AS_USER 配置,来强制使用 root 用户启动。

Maven 编写插件

这一节我们来讲如何编写 Maven 的插件。在生命周期一节中,我们了解到一个插件通常是包含多个目标的,而不同的目标也就对应了生命周期中的不同阶段。在之前的章节中,我们着重介绍如何使用 Maven 的插件,那么在本节中,我们来介绍如何自定义一个插件。其实通常情况下,我们是不需要自己定制插件的,因为 Maven 有太多可以配置的插件供开发者来使用的,所以,除非一个开发者发现自己有非常特殊的需求,而这个需求并不能通过现有的插件来完成的时候,才需要自定义一个 Maven 插件了。

Maven入门教程(三)

1. 什么是插件

在编写插件之前,我们先来看看什么是 Maven 插件。

1.1 控制反转

类似于 Spring 框架的 Ioc 容器,Maven 也沿用了这种做法,将其中与生命周期进行绑定的 Mojo Bean 进行托管,将对象的创建和控制权交与 Ioc 容器来进行管理。在 Ioc 容器中比较重要的一个概念就是依赖注入,在 Maven 编程的时候,会使用到两种依赖注入方式:

  • 构造器注入: 即在对象被创建的时候,通过构造器参数,将对象的值传入并赋值;
  • set 方法注入: 即通过对象属性的 set 方法来为对象的属性赋值。

总的来讲,在 Maven 中实现的 Ioc 容器和 Spring 中的 Ioc 容器是非常类似的。

1.2 Mojo

通常情况下,Maven 插件包括不同的目标,而这些目标则是通过 Mojo 来实现的。Mojo 可以对标 Java 中的 Pojo,这样理解起来就会很方便。而这些 Mojo 对象则是被 Maven 中的 Ioc 容器进行管理的。

例如, install:install 目标对应 Maven Install 插件中的 InstallMojo 的 Java 类。而 deploy:deploy目标则对应 Maven Deploy 插件中的 DeployMojo 的 Java 类。

1.3 插件描述符

在 Maven 插件的 JAR 文件中,有一个 META-INF/maven/plugin.xml 配置文件,这个文件描述了这个插件中的各个 Mojo 对象与其他的插件配置(我们可以在本地仓库中找到任何一个插件,来查看该插件的 plugin.xml 文件)。当一个插件的被添加到依赖中的时候,Maven 会首先去读取这个文件,来对该插件进行初始化。通常,这个文件并不需要我们自己来编写,而是在生成插件的时候,Maven 会帮我们来完成。

2. 编写插件

2.1 编写插件的主要步骤

  1. 创建 maven-plugin 项目: 其实也是创建一个 Maven 项目,只不过 pom.xml 文件中的 packaging 必须为 maven-plugin;
  2. 编写插件目标: 通常情况下,一个插件会有一个或者多个目标,即一个或者多个 Mojo 。而这个 Mojo 类必须要继承 AbstractMojo 类;
  3. 为目标提供配置点: 通常情况下 Maven 插件的目标都是可配置的,所以我们在编写插件的时候,也尽量需要提供可配置的参数;
  4. 实现目标行为: 一个继承了 AbstractMojo 的 Mojo 类,需要实现其中的 excute 方法,这个方法即是插件目标要做的事情;
  5. 记录日志并处理异常: 如同编写其他的程序一样,编写插件的时候,也需要通过记录日志的方式来记录插件的运行状态;
  6. 测试并运行插件: 插件编写完成后,我们要对插件进行简单的测试,并通过实际运行插件的方式来验证插件是否能够满足我们的要求。

从上面的步骤来看,其实编写插件也就相当于编写一个小型的项目,从创建项目到开发,测试再到上线发布,每一个步骤都需要经过。

2.2 编写插件案例

那接下来,我们就实际编写一个小插件来进行演示。

首先,我们在存放代码的目录下执行命令 mvn archetype:generate (在 idea 中根据 archetype 来创建项目,效果相同),选择 maven-archetype-plugin 模板,然后依次按照提示输入 groupId 和 artifactId 等等信息。

这里,我们为这个插件命名为 my-plugin,项目结构如下:

Maven入门教程(三)

接下来,我们就创建一个自己的 Mojo 类,叫做 SumFileMojo,这个目标用于统计当前项目中有多少个Java 类。并且,我们将原本的 MyMojo 类删掉。

package com.mic.tech;import org.apache.maven.plugin.AbstractMojo;import org.apache.maven.plugin.MojoExecutionException;import org.apache.maven.plugin.MojoFailureException;import org.apache.maven.plugins.annotations.LifecyclePhase;import org.apache.maven.plugins.annotations.Mojo;import org.apache.maven.plugins.annotations.Parameter;import java.io.File;import java.util.Objects;/** * @Auther: Uncle Biao * @Date: 2020/6/9 23:37 * @Description: */@Mojo(name = "sumFileCount",defaultPhase= LifecyclePhase.COMPILE)public class SumFileCountMojo extends AbstractMojo {    @Parameter(property = "path")    private String path;    /**     * java文件数量     */    int javaFileCount = 0;    @Override    public void execute() throws MojoExecutionException, MojoFailureException {        System.out.println(countJavaFile(path));    }    public String countJavaFile(String path){        File file = new File(path);        if (file.exists()) {            File [] files = file.listFiles();            if(Objects.isNull(files)){                for(int i=0 ; i < files.length ; i++){                    File currentFile = files[i];                    if(currentFile.isFile()){                        String fileName = currentFile.getName();                        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);                        if("java".equals(suffix)){                            javaFileCount ++;                        }                    }else{                        countJavaFile(currentFile.getAbsolutePath());                    }                }            }        }        return "number of Java File is " + javaFileCount;    }}

编码完成后,我们执行 mvn clean install 命令将插件构建到本地仓库中去。

接下来,我们可以在 mall 项目中加入该插件的依赖,并且为该插件配置执行目标。

<plugin>    <groupId>com.mic.tech</groupId>    <artifactId>my-plugin</artifactId>    <version>1.0.0-SNAPSHOT</version>    <configuration>  	  <path>${project.basedir}</path>    </configuration>    <executions>        <execution>            <phase>compile</phase>            <goals>            	<goal>sumFileCount</goal>            </goals>        </execution>    </executions></plugin>

依赖添加完成后,在 mall-order 模块下执行命令 mvn compile 便可以看到统计出来 Java 文件的数量。

Maven入门教程(三)

至此,我们编写了一个简单的插件,用于统计项目中 Java 文件的数量。

3. 小结

本节中,我们介绍了如何自定义一个 Maven 插件,需要注意的地方,以及通常的编写步骤。最后,我们编写了一个用于统计项目中 Java 文件数量的插件。当 Maven 提供的插件不能满足我们需求的时候,就可以尝试去自定义一个简单插件来供自己使用。

Maven Archetype 原型

从本节开始,我们来介绍一些关于 Maven 的其他技巧,属于锦上添花类型的技巧。这些技巧并不会出现在平时的使用过程中,但是,如果用到的时候,你绝对会有种相见恨晚的感觉。

我们第一个引出来的是 Maven 的 Archetype 原型。我们在最开始的章节中也有所提及,今天我们就来重点讲一下 Archetype 原型在什么情况下会使用到,以及如何使用。

在我们平时的工作中,可能会遇到这种情况:当我们需要创建新工程的时候,可能需要从之前的工程当中移植一些功能过来,或者新工程与之前的工程有着类似的目录结构,这个时候,我们如果直接使用 copy 的方式,就需要做很大的变动,并不是很方便。这个时候,Archetype 原型就能够排上用场了。

1. What is Maven Archetype?

我们从 Maven 的官网可以看到这样一句话:

In short, Archetype is a Maven project templating toolkit. An archetype is defined as an original pattern or model from which all other things of the same kind are made. The name fits as we are trying to provide a system that provides a consistent means of generating Maven projects. Archetype will help authors create Maven project templates for users, and provides users with the means to generate parameterized versions of those project templates.

翻译过来呢是这样子的:简而言之, Archetype 是 Maven 项目模板工具箱。 原型定义为原始的图案或模型,可制成所有其他同类的东西。 这个名称正好适合我们试图提供一个提供生成 Maven 项目的一致方法的系统。 原型将帮助项目创建者为不同用户创建 Maven 项目模板,并为用户提供生成这些项目模板的参数化版本的方法。

通过上述描述,我们可以把 Archetype 简单的理解为我们做蛋糕时候的模子,有了这个模子,我们只需要往里面有选择性的添加原料,就可以做出各种各样美味的蛋糕了

2. How to use Maven Archetype?

上面呢,我们简单介绍了一下 Archetype,也大概了解到它会是一个非常方便的东西,但是我们要怎么制作一个模子呢,制作好了之后,又要怎么使用呢?

2.1 如何制作 Archetype

首先,我们心中要有一个模子的雏形,就像我们现在想要做一个心形的蛋糕,那么我们就要知道心形是什么样子的,才能做出一个心形的模子。

在这里呢,我们就需要一个可以作为模板的工程。例如下图所示:

Maven入门教程(三)

非常标准的一个小项目。

接下来呢,我们就使用这个项目作为例子,来演示如何使用 Archetype。

第一步,我们进入这个项目的根目录,并执行 如下命令:

mvn -s "D:\SOFT\apache-maven-3.6.3\conf\settings.xml" archetype:create-from-project -DpackageName=com.mic.demo
  • s: 指定 maven 的 setting 文件;
  • DpackageName: 指定项目默认包路径。

看到如下结果的时候,就说明我们的模板制定成功了。

Maven入门教程(三)

紧接着,我们可以来到 demo 项目的 target/generated-sources 目录下,看到生成的 archetype 项目,如下图:

Maven入门教程(三)

第二步,我们可以把 archetype 目录复制出来,单独作为一个项目来看。(单独复制出来不是必须的)

导入到 idea 里面后,我们可以看到 Archetype 的项目结构如下:

Maven入门教程(三)

我们现在要做的就是将这个 Archetype 项目构建到我们的 Maven 本地仓库中。

在 Archetype 项目的的根目录下执行如下命令:

mvn install

执行成功后,我们可以在本地仓库中找到对应的 archetype-catalog.xml 文件:

Maven入门教程(三)

以及生成的对应 Archetype 的 jar 包:

Maven入门教程(三)

至此,我们的 Archetype 模板就制作完成了。

2.2 使用已经做好的 Archetype 模型

其实使用起来非常简单,两种方式:

  • 结合 idea 来使用

我们打开 idea 来创建一个 Maven 项目,并选择 add Archetype,将刚刚我们生成的模板坐标添加进去。

Maven入门教程(三)

选择刚刚添加的模板,下一步,并填写相应的信息,就能生成新的项目了。

Maven入门教程(三)

跟我们的模板工程一模一样

  • 我们也可以直接使用命令行来进行创建

进入存放代码的目录执行如下命令:

mvn archetype:generate  -DarchetypeGroupId=com.mic /    					-DarchetypeArtifactId=demo-archetype  /       					-DarchetypeVersion=0.0.1-SNAPSHOT  /       					-DgroupId=com.mic  /       					-DartifactId=archetype-test     /    					-Dversion=0.1     /    					-Dpackage=com.mic.ace     /

其中 DarchetypeGroupId,DarchetypeArtifactId,DarchetypeVersion 用来指定 Archetype 的坐标信息,DgroupId,DartifactId,Dversion 用来指定新创建项目的坐标信息。

3. 注意事项

  • 在创建 Archetype 模板的时候,其实只需要执行:mvn archetype:create-from-project,但是有时候针对 Maven 不同的配置,有可能会去 .m2 目录下去找 settings.xml,可能会造成创建失败;
  • 另外不指定package的话,可能会造成包路径重复;
  • 我们可以制定一个项目基线用来创建项目模板,而不是通过已有项目来创建模板,这样能够最大程度上减少新创建项目中存在不需要的功能;
  • 我们可以直接在 archetype 目录下执行mvn install 用来将原型构建到本地仓库中去。

4. 小结

在本节中,我们主要讲了 Maven 的 Archetype 原型,如何创建自己的 Archetype 以及如何使用 Archetype。后面再有需要创建新项目的时候,可以拿来试一下,事半功倍。

Maven 对接 IDE 使用

在我们实际的开发中,通常会使用到不同的 IDE,而这些 IDE 也都对 Maven 提供了很好的集成,在本节中,我们就来介绍一下在两个常用的 IDE(Eclipse 和 IDEA)中如何使用 Maven。

1. 对接 Eclipse 使用

Eclipse 作为一个老牌的 Java 开发工具,在很长一段时间都是市面上最流行的。现在,我们就介绍一下在 Eclipse 中如何使用 Maven 来构建项目。

  1. 首先,我们来安装 m2eclipse 插件。在菜单中选择:Help >> Install New Software,并在弹出的窗口中输入 m2eclipse 插件的地址 http://download.eclipse.org/technology/m2e/releases
Maven入门教程(三)
  1. 安装插件的过程没什么太多差异,一路 Next 即可完成安装;
  2. 插件安装完成后,我们配置已经安装好的 Maven ,菜单路径:Window >> Preferences,在弹窗中选择Maven >> Installations
Maven入门教程(三)
  1. 并且在 User Settings 中配置对应的 setting.xml 文件和本地仓库;
Maven入门教程(三)

配置好 Maven 之后,我们来构建项目。

在 Eclipse 中使用 Maven 一般有两种方式,一种是使用命令行的形式,一种是在 Configuration 中进行配置,下面我们来介绍一下这两种使用方式。

  1. 使用命令行构建。这种构建方式其实和我们使用 cmd 来构建是一样的。菜单选择Window >> Show view >> Other,在弹出的窗口中选择 Terminal。在控制台中即可执行任何 Maven 相关的命令;
Maven入门教程(三)
  1. 配置 Configuration。这种方式直接在项目的根目录上单击右键,选择Run As >> Maven build,在弹出的窗口中可以输入对应的目标,以及要激活的 profile ,选择好之后,点击下方的 run 按钮即可执行。
Maven入门教程(三)

两种方式本质上没有什么差别,常用的操作可以配置到 Configuration 中,重复使用起来更方便,如果要灵活使用的话,命令行应该是更好的选择。

2. 对接 IDEA 使用

接下来,我们介绍另一种常用的开发工具 IDEA 如何配置并使用 Maven 的。IDEA 在最近几年中,越来越受到开发者的喜爱,在使用 IDEA 的过程中,使用 Maven 也是相当方便的,而且 IDEA 也提供了很多插件来辅助 Maven。接下来,我们就逐一介绍。

首先,我们在 IDEA 中配置 Maven。操作步骤很简单,菜单选择 File >> Settings,在弹出的窗口中搜索 Maven ,然后配置 setting.xml 文件即可。

Maven入门教程(三)

配置完成后,如果导入的项目是 Maven 项目,IDEA 会自动根据 setting.xml 文件中的配置去下载依赖。

在 IDEA 中使用 Maven 的方式也可以归纳为两种,一种就是使用命令行,另一种则是通过插件来使用 Maven。

  1. 使用命令行构建。IDEA 的命令行在工具的下方,点击后就可以打开,直接输入命令就可以执行;
Maven入门教程(三)
  1. 使用插件。其实 IDEA 自带了 Maven 的操作工具,在界面的右侧 ,无需配置,直接点击对应的目标就可以执行对应的 Maven 命令,非常方便。这里推荐一个插件:Maven Helper。

首先,我们安装 Maven Helper 插件,菜单选择:File >> Settings ,在弹出的窗口中选择 Plugins,在其中搜索 Maven Helper 插件,然后点击安装。

Maven入门教程(三)

插件安装完成后,打开 pom.xml 文件可以在下方看到 Dependency Analyzer 选项卡,点击后,可以看到项目的依赖树。可以很好的看到是否存在依赖冲突,非常方便。

Maven入门教程(三)

另外,右侧侧 Maven 功能区中,还有一个堪称神器的功能,Show Dependencies,如下图所示:

Maven入门教程(三)

选中要查看的项目,点击按钮后,会生成该项目的依赖关系图,能够更加直观的看到依赖的关系。

Maven入门教程(三)

3. 小结

本小节中的内容相对较少,主要介绍了在两个常用的 IDE 中如何使用 Maven 的基本操作,平时的开发和工作中,大家可以根据自己的喜好进行选择。

发表评论

登录后才能评论
联系客服
联系客服
分享本页
返回顶部