maven setting

2023-11-10

Maven Phases

Although hardly a comprehensive list, these are the most common default lifecycle phases executed.

    validate: validate the project is correct and all necessary information is available
    compile: compile the source code of the project
    test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
    package: take the compiled code and package it in its distributable format, such as a JAR.
    integration-test: process and deploy the package if necessary into an environment where integration tests can be run
    verify: run any checks to verify the package is valid and meets quality criteria
    install: install the package into the local repository, for use as a dependency in other projects locally
    deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

There are two other Maven lifecycles of note beyond the default list above. They are

    clean: cleans up artifacts created by prior builds

    site: generates site documentation for this project

Phases are actually mapped to underlying goals. The specific goals executed per phase is dependant upon the packaging type of the project. For example, package executes jar:jar if the project type is a JAR, and war:war if the project type is - you guessed it - a WAR.

An interesting thing to note is that phases and goals may be executed in sequence.

    mvn clean dependency:copy-dependencies package

This command will clean the project, copy dependencies, and package the project (executing all phases up to package, of course).
Generating the Site

    mvn site

This phase generates a site based upon information on the project's pom. You can look at the documentation generated under target/site.

什么是Maven仓库

在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等。每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复。重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难。此外,如果你使用版本管理工具,如SVN(你没有使用版本管理工具?马上试试SVN吧,它能帮你解决很多头疼的问题),你需要将大量的jar文件提交到代码库里,可是版本管理工具在处理二进制文件方面并不出色。

Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。

简言之,Maven仓库能帮助我们管理构件(主要是JAR)。

 
本地仓库 vs. 远程仓库

运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

比如说,你的项目配置了junit-3.8的依赖,在你运行mvn test 的时候,Maven需要使用junit-3.8的jar文件,它首先根据坐标查找本地仓库,如果找到,就直接使用。如果没有,Maven会检查可用的远程仓库配置,然后逐个尝试这些远程仓库去下载junit-3.8的jar文件,如果远程仓库存在该文件,Maven会将其下载到本地仓库中,继而使用。如果尝试过所有远程仓库之后,Maven还是没能够下载到该文件,它就会报错。

Maven缺省的本地仓库地址为${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。

你也可以自定义本地仓库的位置,修改${user.home}/.m2/settings.xml :


    <settings>  
      ...   
      <localRepository>D:/java/repository</localRepository>  
      ...   
    </settings>  

你还可以在运行时指定本地仓库位置:

mvn clean install -Dmaven.repo.local=/home/juven/myrepo/

还有一点需要理解的是,当我们运行install的时候,Maven实际上是将项目生成的构件安装到了本地仓库,也就是说,只有install了之后,其它项目才能使用此项目生成的构件。

了解了本地仓库,接着了解一下Maven缺省的远程仓库,即Maven中央仓库。

安装好Maven之后,我们可以建立一个简单的项目,配置一些简单的依赖,然后运行mvn clean install,项目就构建好了。我们没有手工的去下载任何jar文件,这一切都是因为Maven中央仓库的存在,当Maven在本地仓库找不到需要的jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。

这个Maven中央仓库是在哪里定义的呢?在我的机器上,我安装了maven-2.0.10,我可以找到这个文件:${M2_HOME}/lib/maven-2.0.10-uber.jar ,打开该文件,能找到超级POM:/org/apache/maven/project/pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置:

    <repositories>  
      <repository>  
        <id>central</id>  
        <name>Maven Repository Switchboard</name>  
        <layout>default</layout>  
        <url>http://repo1.maven.org/maven2</url>  
        <snapshots>  
          <enabled>false</enabled>  
        </snapshots>  
      </repository>  
    </repositories>   

关于远程仓库的配置,下面的小节我会详细解释,这里我们只要知道,中央仓库的id为central,远程url地址为http://repo1.maven.org/maven2,它关闭了snapshot版本构件下载的支持。

 
在POM中配置远程仓库

前面我们看到超级POM配置了ID为central的远程仓库,我们可以在POM中配置其它的远程仓库。这样做的原因有很多,比如你有一个局域网的远程仓库,使用该仓库能大大提高下载速度,继而提高构建速度,也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。

这里我配置一个远程仓库指向中央仓库的中国镜像:

    <project>  
    ...   
      <repositories>  
        <repository>  
          <id>maven-net-cn</id>  
          <name>Maven China Mirror</name>  
          <url>http://maven.net.cn/content/groups/public/</url>  
          <releases>  
            <enabled>true</enabled>  
          </releases>  
          <snapshots>  
            <enabled>false</enabled>  
          </snapshots>  
        </repository>  
      </repositories>  
      <pluginRepositories>  
        <pluginRepository>  
          <id>maven-net-cn</id>  
          <name>Maven China Mirror</name>  
          <url>http://maven.net.cn/content/groups/public/</url>  
          <releases>  
            <enabled>true</enabled>  
          </releases>  
          <snapshots>  
            <enabled>false</enabled>  
          </snapshots>       
        </pluginRepository>  
      </pluginRepositories>  
    ...   
    </project>  

我们先看一下<repositories>的配置,你可以在它下面添加多个<repository> ,每个<repository>都有它唯一的ID,一个描述性的name,以及最重要的,远程仓库的url。此外,<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。

关于<repositories>的更详细的配置及相关解释,请参考:http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html。

至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和<repository>完全一样,不再解释。

 
在settings.xml中配置远程仓库

我们知道了如何在POM中配置远程仓库,但考虑这样的情况:在一个公司内部,同时进行这3个项目,而且以后随着这几个项目的结束,越来越多的项目会开始;同时,公司内部建立一个Maven仓库。我们统一为所有这些项目配置该仓库,于是不得不为每个项目提供同样的配置。问题出现了,这是重复 !

其实我们可以做到只配置一次,在哪里配置呢?就是settings.xml。

不过事情没有那么简单,不是简单的将POM中的<repositories>及<pluginRepositories>元素复制到settings.xml中就可以,setting.xml不直接支持 这两个元素。但我们还是有一个并不复杂的解决方案,就是利用profile,如下:

    <settings>  
      ...   
      <profiles>  
        <profile>  
          <id>dev</id>  
          <!-- repositories and pluginRepositories here-->  
        </profile>  
      </profiles>  
      <activeProfiles>  
        <activeProfile>dev</activeProfile>  
      </activeProfiles>  
      ...   
    </settings>  

这里我们定义一个id为dev的profile,将所有repositories以及pluginRepositories元素放到这个profile中,然后,使用<activeProfiles>元素自动激活该profile。这样,你就不用再为每个POM重复配置仓库。

使用profile为settings.xml添加仓库提供了一种用户全局范围的仓库配置。

 
镜像

如果你的地理位置附近有一个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使用settings.xml中的mirror配置。

以下的mirror配置用maven.net.cn覆盖了Maven自带的central:

    <settings>  
    ...   
      <mirrors>  
        <mirror>  
          <id>maven-net-cn</id>  
          <name>Maven China Mirror</name>  
          <url>http://maven.net.cn/content/groups/public/</url>  
          <mirrorOf>central</mirrorOf>  
        </mirror>  
      </mirrors>  
    ...   
    </settings>  

这里唯一需要解释的是<mirrorOf>,这里我们配置central的镜像,我们也可以配置一个所有仓库的镜像,以保证该镜像是Maven唯一使用的仓库:

    <settings>  
    ...   
      <mirrors>  
        <mirror>  
          <id>my-org-repo</id>  
          <name>Repository in My Orgnization</name>  
          <url>http://192.168.1.100/maven2</url>  
          <mirrorOf>*</mirrorOf>  
        </mirror>  
      </mirrors>  
    ...   
    </settings>  

关于更加高级的镜像配置,可以参考:http://maven.apache.org/guides/mini/guide-mirror-settings.html。

 
分发构件至远程仓库

mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库。本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。

我们需要配置POM的distributionManagement来指定Maven分发构件的位置,如下:

    <project>     
      ...     
      <distributionManagement>     
        <repository>     
          <id>nexus-releases</id>     
          <name>Nexus Release Repository</name>     
          <url>http://127.0.0.1:8080/nexus/content/repositories/releases/</url>     
        </repository>     
        <snapshotRepository>     
          <id>nexus-snapshots</id>     
          <name>Nexus Snapshot Repository</name>     
          <url>http://127.0.0.1:8080/nexus/content/repositories/snapshots/</url>     
        </snapshotRepository>     
      </distributionManagement>     
      ...     
    </project>     

Maven区别对待release版本的构件和snapshot版本的构件,snapshot为开发过程中的版本,实时,但不稳定,release版本则比较稳定。Maven会根据你项目的版本来判断将构件分发到哪个仓库。

一般来说,分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。这个时候,如下在settings.xml中配置认证信息:

    <settings>     
      ...     
      <servers>     
        <server>     
          <id>nexus-releases</id>     
          <username>admin</username>     
          <password>admin123</password>     
        </server>     
        <server>     
          <id>nexus-snapshots</id>     
          <username>admin</username>     
          <password>admin123</password>     
        </server>       
      </servers>     
      ...     
    </settings>  

需要注意的是,settings.xml中server元素下id的值必须与POM中repository或snapshotRepository下id的值完全一致。将认证信息放到settings下而非POM中,是因为POM往往是它人可见的,而settings.xml是本地的。

 
小结

本文介绍了Maven仓库,它是什么?本地仓库,远程仓库,中央仓库具体是指什么?并介绍了如何在POM中配置项目层次的仓库,在settings中配置用户层次的仓库,以及mirror。本文还介绍了如何安装构件到本地仓库,如何分发构件至仓库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

maven setting 的相关文章

随机推荐

  • 获取时间段:本周、本月、本年

    case 本周内 DateTime retStartDay DateTime Now Date AddDays int DateTime Now DayOfWeek 1 DateTime retEndDay DateTime Now Dat
  • arp协议属于哪一层_OSI各个分层分别负责哪些功能?有哪些主要协议?涉及到哪些设备?...

    应用层 应用层主要是负责一些顶层协议的工作 主要包括数据封装协议 动态分配内网IP地址以及DNS域名解析 在这一层中主要是浏览器或应用程序等组件参与了这些工作 为了保证在不同平台或不同组件中规范和标准化各项工作流程 应用层涉及了以下协议 首
  • 如何 在 Mac OS X 里通过命令行获取 CPU 信息

    本文转载至 http osxdaily com 2011 07 15 get cpu info via command line in mac os x 转载说明 由于 Mac OS X不像Linux 它没有 proc系统 在网上找到下面一
  • 把整数转换成2的n次方的和数组

    为什么80 的码农都做不了架构师 gt gt gt 大概这样 125 gt 1 4 8 16 32 64 写几种实现 Ruby 2 3 1 022 gt 125 to s 2 reverse chars map with index b i
  • Github清除历史记录的方法

    GitHub历史提交记录累计到一定程度以后 就很麻烦 体积大下载不便 压缩也慢 这时候就想永久性地删除掉没什么卵用的历史commit记录 但还要保留stars forks issues tags等重要信息 因此不能删掉仓库重建一份 而要创建
  • windows10安装opencv4.5.4,搭配vs2017

    windows10安装opencv4 5 4 搭配vs2017 1 下载opencv安装包 2 安装opencv 2 设置环境变量 3 在visual studio 2017中配置opencv 3 1 创建项目 3 2 配置 VC 目录 包
  • CSMA/CD与CSMA/CA

    对照无线网络 有线网络的集线器和中继器设计中 採用了CSMA CD技术 该技术早期是用来解决有线网络中 共享介质下的多路网络接入问题 该技术仍然在当今的10M 100M半双工网络中使用 在更高的带宽情况下 比方千M网络 则採用全双工技术以取
  • 如何压缩图片大小?图片压缩到200k以下跟我学

    相信许多人在日常生活中都会遇到图片过大导致无法上传或发送的问题 这时候 如何有效地压缩图片大小就成了我们的必备技能 今天 我将为大家介绍三种方法 帮助大家轻松压缩图片大小 一般来说 我们希望在不损失太多图片质量的情况下 尽可能地减小图片的大
  • 滑动窗口系列4-Leetcode322题零钱兑换-限制张数-暴力递归到动态规划再到滑动窗口

    这个题目是Leecode322的变种 322原题如下 我们这里的变化是把硬币变成可以重复的 并且只有coins数组中给出的这么多的金币 也就是说有数量限制 package dataStructure leecode practice imp
  • 虚拟现实下的手势识别综述

    虚拟现实下的手势识别综述 目录 虚拟现实下的手势识别综述 摘要 关键词 1 引言 2 国内外研究现状 3 手势识别的关键技术 3 1手势分割 3 2手势建模 3 3手势识别 3 4特征提取 4 存在的问题及发展趋势 5 结论 参考文献 摘要
  • js list 根据id 取不重复的数据,出现重复的完全剔除

    可以使用Set数据结构来实现根据id取不重复的数据 并剔除重复的数据 假设有一个包含多个对象的数组arr 每个对象都有一个id属性 你可以按照以下步骤进行操作 创建一个空的Set对象 用于存储不重复的id 使用forEach 方法遍历数组a
  • QT入门Buttons之QPushButton

    目录 一 界面布局介绍 1 布局器中的位置及使用 2 控件的界面属性 3 常用基本属性介绍 3 1控件名称 3 2控件大小属性 3 3按钮上的文字设置 3 4设置按钮的样式 二 属性功能介绍 1 常用方法介绍 2 基本信号介绍 三 Demo
  • servlet 会话_在Servlet中管理会话

    servlet 会话 We all know that HTTP is a stateless protocol All requests and responses are independent But sometimes you ne
  • CentOS7创建新用户

    使用root账号登录 输入新增用户的命令 XXX 指定自己新增的用户名 root localhost adduser XXX 给新增的用户名设置密码 XXX 为刚才自己设置的用户名 root localhost passwd XXX 给新用
  • PHP学习线路图

    PHP学习线路图 PHP教程 PHP教程 PHP简介 PHP环境设置 PHP语法概述 PHP变量类型 PHP常量类型 PHP运算符类型 PHP 条件语句 PHP循环语句 PHP数组 PHP字符串操作 PHP Web概念 PHP的GET和PO
  • Java链表的基本使用

    链表是一种根据元素节点逻辑关系排列起来的一种数据结构 利用链表可以保存多个数据 这一点类似于数组的概念 但是数组本身有一个缺点 数组的长度固定 不可改变 在长度固定的情况下首选的肯定是数组 但是在现实的开发之中往往要保存的内容长度是不确定的
  • 2022计算机软件毕业设计大全

    springboot快递代拿系统 6630 电竞选手管理系统 SSM MySQL 6629 自习室预约网站 SSM MySQL 6626 眼镜销售系统 SSM MySQL 6620 基于Java的学生管理系统 IDEA SSM MySQL
  • Centos7 增加/修改SSH连接端口

    Centos7 增加 修改SSH连接端口 1 修改配置文件 2 如果你关闭了SELinux 可以忽略这一步 3 防火墙开放22345端口 4 重启SSH服务和防火墙 最好也重启下服务器 1 修改配置文件 vim etc ssh sshd c
  • typescript变量声明入门 泛型 interface 可索引接口 type

    最近面试了好多人 简历都写熟练使用TypeScript 可是聊下来发现声明复杂一点的变量只会any 简直就是来搞笑的 TypeScript 是 JavaScript 的超集 扩展了 JavaScript 的语法 TypeScript中为了使
  • maven setting

    Maven Phases Although hardly a comprehensive list these are the most common default lifecycle phases executed validate v