Maven使用及Nexus私服的搭建

菜鸟Maven

Maven主要帮助开发者完成依赖、构建、发布等工作,声名文件是项目或各模块内的pom.xml。

Maven安装

  1. 下载并解压
  2. 配置环境变量
  3. 配置远程仓库镜像及本地仓库目录:${M2_HOME}/conf/settings.xml

生命周期

Maven有三个标准的生命周期:

  • clean
  • default(build)
  • site

不同的生命周期又抽象出了各阶段(phase):每个阶段都成为了一个扩展点,可以采用不同的方式来实现,提高了扩展性与灵活性;同时规范了Maven的执行路径。

Maven插件

生命周期中各阶段(phase)的实际操作由Maven插件执行,Maven的核心部分代码量很少,大部分实现都是由插件来完成。

在pom.xml中,可以设置指定插件目标(goal)与阶段(phase)绑定,当项目构建到给定阶段时,就会触发绑定插件的goal的执行,如官网演示的插件执行器

另外,插件也可以通过mvn plugin-name:goal直接运行。

插件与生命周期的关系是:

  • 生命周期的阶段可以绑定到具体的插件及目标
  • 不同配置下,同一个阶段可以对应多个插件和目标(如打jar包和打war包时)
  • Maven默认为不同的阶段绑定了插件实现,参见说明和实现(%M2_HOME%/lib/maven-core.xxx.jar/MATE-INF/plexus/default-bindings.xml

如何自定义Maven插件参见这里

Maven项目结构

即约定大于配置:

----(${basedir})
    |
    pom.xml
    |
    /src/main/java/
    /src/main/resources/
    /src/main/webapp/WEB-INF/
    /src/test/java/
    /src/test/resources/
    /target/classes/
    /target/test-test-classes/
    

常用命令

  • mvn clean
  • mvn compile
  • mvn package
  • mvn test
  • mvn archetype:generate
    ...

依赖

  • 依赖传播:只需要在项目的pom中定义好直接的依赖关系,间接依赖maven会帮我们搞定;

  • 依赖优先原则

    • 最短路径
    • 相同路径配置在前的优先
    • 同一个pom文件,同一个依赖的不同版本,配置在后的生效
  • 依赖可选:父项目P不允许子项目C依赖其可选依赖<optional>

  • 依赖排除:子项目C不依赖父项目P的目标依赖<exclusions>

  • 依赖管理:在rootpom.xml声明所有依赖(使用dependencyManagement与否皆可),所有继承其的子项目不用再指定依赖版本。

  • 依赖范围:范围指的是编译、测试、运行三个阶段,声明依赖时指定不同的范围(通过<scope>标签),maven会在不同的阶段将其引入classpath。详情参考这篇博客

    • compile:默认的依赖范围,编译、测试运行三个阶段都会被引入classpath
    • test:只有在测试阶段会被引入,代码编译和项目运行时不会被引入,如jUnit
    • provided:只有在编译和测试时候会被引入,项目运行时不会被引入,如setvlet-api
    • runtime:只有在测试和运行阶段会被引入,编译阶段不会被引入,如JDBC驱动,编译时只提供接口
    • system:非Maven仓库中的jar,与provided一致,但需通过systemPath来指定依赖文件的路径
    • import:与dependencyManagement元素配合使用

聚合

指将多个模块整合在一起,统一构建。需要一个父工程,使用<modules>配置其中对应的子工程的相对路径。

继承

子工程通过<parent>继承父工程,则可以继承其:

  • 属性:通过<properties>标签配置,引用方式是${属性名称},maven的默认属性有 ${basedir}、${version}
  • 依赖
  • 插件

上面的三个配置子工程够可以重写,重写之后以子工程为准。

Maven仓库

Maven仓库分为:

  • 本地仓库(Maven所需的构件都是直接从本地仓库获取的,若本地仓库没有,会从远程仓库下载至本地仓库后再使用。默认位置是%USER_HOME%/.m2/repository,在%M2_HOME%/conf/setting.xml配置文件中可修改)
  • 中央仓库(Maven 社区提供的仓库)
  • 远程仓库(中央仓库、阿里镜像、企业私服等)

Maven项目中可以修改仓库位置共有一下几处:

  • 中央仓库,默认的仓库
  • 镜像仓库,settings.xml中的settings.mirrors.mirror
  • 全局profile仓库,settings.xml中的settings.profiles.profile.repositories.repository
  • 项目仓库,pom.xml中的project.repositories.repository
  • 项目profile仓库,pom.xml中的project.profiles.profile.repositories.repository
  • 本地仓库

若所有配置都存在,依赖的搜索顺序就会变得异常复杂,详见这里介绍。结论如下:

  • 只要本地仓库中包含依赖,无论怎么配置,都会优先使用local本地仓库中的jar
  • local_repo>settings_profile_repo>pom_profile_repo>pom_repositories>settings_mirror>central

Maven Profiles

Maven构建配置文件用于修改构建过程,可以被多种方式激活。

settings.xml中提供的配置文件旨在提供本地计算机特定的路径和存储库位置,以允许构建在本地环境中工作。对于settings.xml中定义的配置文件,您只能指定仓库位置,插件仓库位置和自由格式属性,以用作POM中插件的配置变量。

pom.xml中也可以指定profiles和activeProfiles来进行差异化构建。

Nexus私服的搭建

私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件,参见这里

下载

下载地址点我,一种是包含jetty容器的bundle包,另一种是不包含容器的war包,按需下载即可。

安装

  • Windows安装见这里(3.0以下版本)

    • 3.0及以上版本免安装、免配置,见这里
    • 在cmd中从C盘到D盘不使用cd命令符,直接输入D:即可。
  • Linux安装方式如下,yum安装点我

    • 解压tar -zxvf nexus-2.14.5-02-bundle.tar.gz
    • 在环境变量中设置启动用户 vim /etc/profile,不建议使用root用户,如果使用其他用户需要增加相应权限export RUN_AS_USER=root
    • 配置启动参数 vim ${nexusBase}/conf/nexus.properties,默认端口8081
    • 启动与停止 ${nexusBase}/bin/nexus start/stop,若注册为服务
    • 登录页面 http://{ip}:port/nexus,用户名admin,密码admin123

仓库说明

  • 3rd party:第三方仓库
  • Apache Snapshots:Apache快照仓库
  • Central :Maven中央仓库,一般要修改该仓库的Remote Storage Location的值为国内镜像地址
  • Releases:私有发布版本仓库
  • Snapshots:私有快照版本仓库

指向私服

  • pom.xml中的project.repositories.repository
  • settings.xml中的settings.mirrors.mirror

若指向私服后,依赖无法找到,可能是因为这个原因

发布项目至私服

  • pom.xml中使用<distributionManagement>进行配置
  • settings.xml中配置<server>认证信息

详情参见这里

推荐阅读更多精彩内容