Maven总结

Stella981
• 阅读 687

何为maven?

  1. Maven主要是基于Java平台的项目构建,依赖管理和项目信息
  2. Maven是优秀的构建工具,跨平台,消除构建的重复,抽象了一个完整的构建生命周期模型,标准化构建过程
  3. 管理分布的项目信息,版本控制系统,轻松获取项目文档,测试报告,静态分析报告,版本日志报告等
  4. 极限编程(XP)的搭配是非常不错的,比如持续集成(CI)
  5. 在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件,构件存储在仓库,(仓库就是存放依赖和插件的地方),任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径

maven安装配置

  1. 安装jdk
  2. 下载maven,到http://maven.apache.org/download.cgi下载如:
    apache-maven-3.5.3-bin.zip
  3. 配置环境变量
  4. 查看mvn –v

注:maven需要先安装好jdk

maven目录结构

Maven总结

bin:该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,还包含了m2.conf文件,这是classworlds的配置文件

boot:就包含了一个文件,以这次的下载的版本,该文件是plexus-classworlds-2.5.2.jar,是一个类加载器框架

conf:这个目录用到的非常重要的文件setting.xml,直接修改该文件,就能在机器上全局地制定了Maven的行为

lib:该目录包含了所有Maven运行时需要的Java类库,Maven是分模块开发的,可以说lib目录就是真正的目录,还包含内置的超级POM(所有的POM均继承此文件,你可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-x.x.x.jar,然后访问路径org/apache/maven/model/pom-4.0.0.xml)

settings.xml文件配置

用户配置路径为${user.home}/.m2/settings.xml,该配置需用户自行创建

全局配置路径为${maven.conf}/settings.xml,该配置为maven自带配置,即原文所在位置

当两者都存在时,maven会合并这2个配置;有相同配置参数时,有效值为用户配置中的参数

localRepository

本地仓库路径,默认路径为${user.home}/.m2/repository

interactiveMode

互动模式,默认值为true。该值使用默认值即可,无需更改

offline

离线模式,默认值为false。当因为各种原因无法与远程仓库连接时,可将该值修改为true

pluginGroups

插件组,内部由n个pluginGroup节点组成,默认自带了org.apache.maven.plugins和org.codehaus.mojo。若有特殊的需求是可进行扩展。

proxies

   

        optional

        true

        http

        proxyuser

        proxypass

        proxy.host.net

        80

        local.net|some.host.com

   

代理设置,内部由n个proxy节点组成。部分公司出于安全考虑会需要员工通过代理才可上网,这时,就需配置该节点的参数了。

参数说明:

id:唯一标识符

active:是否被激活使用,默认为true。当有多个proxy节点存在时,用于选择使用哪个代理,但同一时间仅有一个代理会被被激活

protocol:协议类型

username:用户名,没有可不填

password:密码,没有可不填

host:IP地址

port:端口号

nonProxyHosts:不使用代理的地址

以上参数在通常配置代理的情况都会使用到,一样填上即可,最终的代理地址为protocol://host:port

servers

   

        nexus1

        admin

        admin123

   

   

        nexus2

        /path/to/private/key

        optional; leave empty if not used

   

服务器,内部由n个server节点组成。有2种配置方式:一种是通过id匹配,username和password进行认证登录;另一种是通过id匹配指向一个privateKey(私钥)和一个passphrase

mirrors

   

        nexus

        *

        http://localhost:8081/repository/maven-public/

   

   

        repo2

        central

        Human Readable Name for this Mirror.

        http://repo2.maven.org/maven2/

   

镜像仓库,内部由n个mirror节点组成。用来代替中央仓库(Maven默认的远程仓库),用于提升传输速度。因此此处可以添加一个镜像,以提升我们下载的速度

profiles

用于覆盖在一个POM或者profiles.xml文件中的任何相同id的profiles节点

activeProfiles

activeProfile值为profile中所定义的id,在这里定义的activeProfile总是被激活

总结:

一般情况而言,settings.xml无需配置太多的东西,作为优化,可配置localRepository和mirrors

maven的简单使用

maven项目的目录约定

MavenProjectRoot(项目根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring配置文件
   |     |----test
   |     |         |----java ——存放所有测试.java文件,如JUnit测试类
   |     |         |----resources ——存放项目资源文件,如spring配置文件
   |----target ——项目输出位置
   |----pom.xml ----用于标识该项目是一个Maven项目

使用maven命令创建项目

mvn archetype:generate固定写法

  -DgroupId                           组织标识(包名)

  -DartifactId                                 项目名称

  -DarchetypeArtifactId                    指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;

maven-archetype-webapp,创建一个Web Project

-DinteractiveMode                      是否使用交互模式

例如:

mvn archetype:generate -DgroupId=com.qianbao.bhh -DartifactId=bhh-web -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;

常用maven命令

mvn -v                         查看maven的版本及配置信息

mvn compile                    编译项目代码

mvn package                   打包项目

mvn package -Dmaven.test.skip=true   打包项目时跳过单元测试

mvn test                        运行单元测试

mvn clean                      清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test

mvn install                     打包后将其安装在本地仓库

mvn deploy                     打包后将其安装到pom文件中配置的远程仓库

mvn site                        生成站点目录

mvn dependency:list           显示所有已经解析的所有依赖

mvn dependency:tree         以树的结构展示项目中的依赖

mvn dependency:analyze     对项目中的依赖进行分析,依赖未使用,使用但未引入

mvn -settings D:\nexus-settings.xml  制定settings配置文件

maven的核心概念

坐标

什么是坐标?

在平面几何中坐标(x,y)可以标识平面中唯一的一点。

maven坐标组成

  • groupId:组织标识(包名)
  • artifactId:项目名称
  • version:项目的当前版本
  • packaging:项目的打包方式,最为常见的jar、war、pom等

maven为什么使用坐标?

  • Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范。
  • 拥有了统一规范,就可以把查找工作交给机器。

依赖管理

依赖配置

               junit

               junit

               4.9

       

依赖范围

依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系**.** 主要的是三种依赖关系如下:
  1.compile****: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  2.test:测试依赖范围。只对于测试classpath有效
  3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  4.runtime:运行时提供。例如:jdbc驱动

传递性依赖

Maven总结

仓库管理

maven仓库

用来统一存储所有Maven共享构建的位置就是仓库

maven仓库布局

根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging

仓库分类

本地仓库

每个用户只有一个本地仓库,默认是在/.m2/repository/,代表的是用户目录

远程仓库

中央仓库:Maven默认的远程仓库,URL地址:http://search.maven.org/

私服:是一种特殊的远程仓库,它是架设在局域网内的仓库

Maven总结

生命周期

何为生命周期?

maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤

mven三大生命周期

maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:

  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  3. Site Lifecycle 生成项目报告,站点,发布站点。

再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

Clean Lifecycle

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

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

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

Default Lifecycle

Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:

  1. validate
  2. generate-sources
  3. process-sources
  4. generate-resources
  5. process-resources 复制并处理资源文件,至目标目录,准备打包。
  6. compile 编译项目的源代码。
  7. process-classes
  8. generate-test-sources
  9. process-test-sources
  10. generate-test-resources
  11. process-test-resources 复制并处理资源文件,至目标测试目录。
  12. test-compile 编译测试源代码。
  13. process-test-classes
  14. test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  15. prepare-package
  16. package 接受编译好的代码,打包成可发布的格式,如 JAR 。
  17. pre-integration-test
  18. integration-test
  19. post-integration-test
  20. verify
  21. install 将包安装至本地仓库,以让其它项目依赖。
  22. deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

Site Lifecycle

Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作

  1. site 生成项目的站点文档
  2. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  3. site-deploy 将生成的站点文档部署到特定的服务器上

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

聚合与继承

聚合

聚合是为了快速构建项目,如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合,例如:

    baihua_web

    baihua_api

    baihua_core

    baihua_search

    baihua_batch

    baihua_oms_web

    baihua_schedule

继承

继承为了消除重复,我们把很多相同的配置提取出来,例如:grouptId,version等

继承配置代码

    com.qianbao.baihua

    baihua-parent

    1.0.0

继承代码中定义属性

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <java.version>1.8</java.version>

    <maven.compiler.source>${java.version}</maven.compiler.source>

    <maven.compiler.target>${java.version}</maven.compiler.target>

    <assertj-core.version>3.5.2</assertj-core.version>

    <dropwizard-metrics.version>3.1.2</dropwizard-metrics.version>

    <spring.version>4.3.4.RELEASE</spring.version>

    <hibernate.version>5.2.4.Final</hibernate.version>

    <hibernate-validator.version>5.2.4.Final</hibernate-validator.version>

    <junit.version>4.12</junit.version>

父模块用dependencyManagement进行管理

   

       

            org.springframework.boot

            spring-boot-test

            test

       

   

子模块可以有选择行的继承,而不需要全部继承

私服nexus3安装及使用

安装

下载地址:http://www.sonatype.com/download-oss-sonatype 

Maven总结

windows版本安装:

选择相应安装包下载,下载后解压得到如下:

Maven总结

  1. cmd执行nexus-3.12.1-01/bin/nexus /run
  2. 如果要安装为windows服务,执行nexus /install,提示服务安装成功后,启动执行net start nexus,停止执行net stop nexus。
  3. 安装完成后默认开放8081端口(nexus\nexus-3.12.1-01\etc\ nexus-default.properties中配置)
  4. 安装成功后有两个默认账号admin、anonymous,其中admin具有全部权限默认密码admin123;anonymous作为匿名用户,只具有查看权限。

 

Linux版本安装:

选择相应安装包下载,下载后解压得到如下:

Maven总结

cd bin下执行./nexus start

Maven总结

配置文件在etc/nexus-default.properties中,可修改端口,默认8081;用户admin,密码admin123

使用

Repositories说明

  1. maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
  2. maven-releases:私库发行版jar
  3. maven-snapshots:私库快照(调试版本)jar
  4. maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。

本地maven库配置settings.xml

D:\Repositories\Maven

  

      nexus

      admin

      admin123

  

  

     nexus

     *

     http://localhost:8081/repository/maven-public/

  

    

     repo2 

     central 

     Human Readable Name for this Mirror. 

     http://repo2.maven.org/maven2/ 

  

  

        nexus

       

        

           central

           http://central

           true

           true

        

       

      

        

           central

           http://central

           true

           true

        

       

  

 

   nexus

pom.xml配置

  

      nexus

      Releases

      http://localhost:8081/repository/maven-releases

  

  

      nexus

      Snapshot

      http://localhost:8081/repository/maven-snapshots

  

Maven多模块项目搭建

  1. 创建父模块demo

mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;

  1. 进入父模块里,删除src文件夹,修改pom文件中pom
  2. 创建子模块demo-web

mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-web -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;

  1. 创建子模块demo-core

mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-core -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;

  1. 创建子模块demo-api

mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-api -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;

  1. 创建子模块demo-admin

mvn archetype:generate -DgroupId=com.enterprise.demo -DartifactId=demo-admin -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false;

  1. 修改父pom文件,添加如下:

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <java.version>1.8</java.version>

   

        

            com.enterprise.demo

            demo-api

            1.0-SNAPSHOT

       

       

            com.enterprise.demo

            demo-core

            1.0-SNAPSHOT

       

       

            com.enterprise.demo

            demo-web

            1.0-SNAPSHOT

       

       

            junit

            junit

            ${junit.version}

       

   

   

        nexus

        Releases

        http://localhost:8081/repository/maven-releases

   

   

        nexus

        Snapshot

        http://localhost:8081/repository/maven-snapshots

   

  1. 各模块依赖关系

web依赖core

core依赖api

admin依赖core

  1. 其他注意事项

各子模块pom中去掉groupid,可继承父模块

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这