当前位置: 首页 > news >正文

Maven总结

为什么80%的码农都做不了架构师?>>>   hot3.png

何为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目录结构

a658751be9fdcc2925615f465d42197bf94.jpg

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

<proxies>

    <proxy>

        <id>optional</id>

        <active>true</active>

        <protocol>http</protocol>

        <username>proxyuser</username>

        <password>proxypass</password>

        <host>proxy.host.net</host>

        <port>80</port>

        <nonProxyHosts>local.net|some.host.com</nonProxyHosts>

    </proxy>

</proxies>

 

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

参数说明:

id:唯一标识符

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

protocol:协议类型

username:用户名,没有可不填

password:密码,没有可不填

host:IP地址

port:端口号

nonProxyHosts:不使用代理的地址

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

servers

<servers>

    <server>

        <id>nexus1</id>

        <username>admin</username>

        <password>admin123</password>

    </server>

    <server>

        <id>nexus2</id>

        <privateKey>/path/to/private/key</privateKey>

        <passphrase>optional; leave empty if not used</passphrase>

    </server>

</servers>

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

mirrors

<mirrors>

    <mirror>

        <id>nexus</id>

        <mirrorOf>*</mirrorOf>

        <url>http://localhost:8081/repository/maven-public/</url>

    </mirror>

    <mirror>

        <id>repo2</id>

        <mirrorOf>central</mirrorOf>

        <name>Human Readable Name for this Mirror.</name>

        <url>http://repo2.maven.org/maven2/</url>

    </mirror>

</mirrors>

镜像仓库,内部由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:项目的打包方式,最为常见的jarwarpom

maven为什么使用坐标?

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

依赖管理

依赖配置

<dependencies>
        <dependency>

               <groupId>junit</groupId>

               <artifactId>junit</artifactId>

               <version>4.9</version>

        </dependency>

</dependencies>

依赖范围

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

传递性依赖

33f1676f43dd68222ebda43f120f171860d.jpg

仓库管理

maven仓库

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

maven仓库布局

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

仓库分类

本地仓库

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

远程仓库

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

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

0f50d97d76b1c7944d789d99062b26af80a.jpg

生命周期

何为生命周期?

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

mven三大生命周期

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

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

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

Clean Lifecycle

clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的cleanClean生命周期的一个阶段。有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-cleanclean 都会被运行。这是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比较喜欢,文档及统计数据自动生成,很好看。

聚合与继承

聚合

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

<modules>

    <module>baihua_web</module>

    <module>baihua_api</module>

    <module>baihua_core</module>

    <module>baihua_search</module>

    <module>baihua_batch</module>

    <module>baihua_oms_web</module>

    <module>baihua_schedule</module>

</modules>

继承

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

继承配置代码

<parent>

    <groupId>com.qianbao.baihua</groupId>

    <artifactId>baihua-parent</artifactId>

    <version>1.0.0</version>

</parent>

继承代码中定义属性

<properties>

    <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>

</properties>

父模块用dependencyManagement进行管理

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-test</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

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

私服nexus3安装及使用

安装

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

7d9296a253b1607f6d5bcf8dc5d5b5624df.jpg

windows版本安装:

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

a97926523dabf98fea3f2ffb590bf56cad6.jpg

  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版本安装:

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

273b4e08130c89fa4260c6a0295406e4c18.jpg

cd bin下执行./nexus start

3db3aa1fc69ae6a889332970642ae7b6d32.jpg

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

使用

Repositories说明

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

本地maven库配置settings.xml

<localRepository>D:\Repositories\Maven</localRepository>



<servers>

   <server>

      <id>nexus</id>

      <username>admin</username>

      <password>admin123</password>

   </server>

</servers>



<mirrors>

   <mirror>

     <id>nexus</id>

     <mirrorOf>*</mirrorOf>

     <url>http://localhost:8081/repository/maven-public/</url>

   </mirror>

   <mirror>  

     <id>repo2</id>  

     <mirrorOf>central</mirrorOf>  

     <name>Human Readable Name for this Mirror.</name>  

     <url>http://repo2.maven.org/maven2/</url>  

   </mirror>

</mirrors>



<profiles>

   <profile>

        <id>nexus</id>

        <repositories>

         <repository>

           <id>central</id>

           <url>http://central</url>

           <releases><enabled>true</enabled></releases>

           <snapshots><enabled>true</enabled></snapshots>

         </repository>

        </repositories>

       <pluginRepositories>

         <pluginRepository>

           <id>central</id>

           <url>http://central</url>

           <releases><enabled>true</enabled></releases>

           <snapshots><enabled>true</enabled></snapshots>

         </pluginRepository>

        </pluginRepositories>

   </profile>

</profiles>

  

<activeProfiles>

   <activeProfile>nexus</activeProfile>

</activeProfiles>

pom.xml配置

<distributionManagement>

   <repository>

      <id>nexus</id>

      <name>Releases</name>

      <url>http://localhost:8081/repository/maven-releases</url>

   </repository>

   <snapshotRepository>

      <id>nexus</id>

      <name>Snapshot</name>

      <url>http://localhost:8081/repository/maven-snapshots</url>

   </snapshotRepository>

</distributionManagement>

Maven多模块项目搭建

  1. 创建父模块demo

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

  1. 进入父模块里,删除src文件夹,修改pom文件中<packaging>pom</packaging>
  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文件,添加如下:
<!-- 版本统一控制 -->
<properties>

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

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

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

</properties>



<!-- 依赖管理 -->

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>com.enterprise.demo</groupId>

            <artifactId>demo-api</artifactId>

            <version>1.0-SNAPSHOT</version>

        </dependency>

        <dependency>

            <groupId>com.enterprise.demo</groupId>

            <artifactId>demo-core</artifactId>

            <version>1.0-SNAPSHOT</version>

        </dependency>

        <dependency>

            <groupId>com.enterprise.demo</groupId>

            <artifactId>demo-web</artifactId>

            <version>1.0-SNAPSHOT</version>

        </dependency>



        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>${junit.version}</version>

        </dependency>

    </dependencies>

</dependencyManagement>



<!-- 仓库管理 -->

<distributionManagement>

    <repository>

        <id>nexus</id>

        <name>Releases</name>

        <url>http://localhost:8081/repository/maven-releases</url>

    </repository>

    <snapshotRepository>

        <id>nexus</id>

        <name>Snapshot</name>

        <url>http://localhost:8081/repository/maven-snapshots</url>

    </snapshotRepository>

</distributionManagement>
  1. 各模块依赖关系

web依赖core

core依赖api

admin依赖core

  1. 其他注意事项

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

 

转载于:https://my.oschina.net/jzgycq/blog/1921931

相关文章:

  • perl常用正则表达式集合
  • Centos7安装搜狗输入法
  • Socket层实现系列 — bind()的实现(二)
  • more
  • 网络爬虫(网络蜘蛛)之网页抓取
  • 8 .5 .4 创建计划
  • Asp.net弹出层并且有遮罩层
  • WebView.简单使用_ZC代码
  • StringUtils工具类用法
  • 推荐一个React的管理后台框架
  • JQuery FullCalendar(二)
  • 在Pd中取消Code Name 同步
  • QTREE5 - Query on a tree V(LCT)
  • C/C++ Volatile关键词深度剖析
  • word2vec原理(一) CBOW与Skip-Gram模型基础——转载自刘建平Pinard
  • 【剑指offer】让抽象问题具体化
  • Bytom交易说明(账户管理模式)
  • ES6简单总结(搭配简单的讲解和小案例)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • IDEA 插件开发入门教程
  • Median of Two Sorted Arrays
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Vue全家桶实现一个Web App
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 使用SAX解析XML
  • 手写一个CommonJS打包工具(一)
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 小而合理的前端理论:rscss和rsjs
  • 携程小程序初体验
  • 一些关于Rust在2019年的思考
  • 交换综合实验一
  • #Linux(make工具和makefile文件以及makefile语法)
  • $forceUpdate()函数
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (7)STL算法之交换赋值
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (转) 深度模型优化性能 调参
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 成都线下面基会拉开序幕
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .sh 的运行
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @RequestMapping处理请求异常
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ C++ ] 继承
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [383] 赎金信 js
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]