首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Maven使用速记 原

Maven使用速记 原

作者头像
随风溜达的向日葵
发布于 2019-05-15 05:03:55
发布于 2019-05-15 05:03:55
54100
代码可运行
举报
文章被收录于专栏:技术墨客技术墨客
运行总次数:0
代码可运行

Maven生命周期阶段

Maven为打包过程提供了各种各样的生命周期功能,主要有:

  1. Validate:验证,对工程的所有内容进行验证。
  2. compile:编译。
  3. test:运行测试用例。
  4. package:将代码进行打包并生成到本地。
  5. integration-test:与其他的工程进行集成测试,会将依赖内容放置到一个统一环境中。
  6. verify:校验功能,检查包的质量。
  7. install:将打包之后的文件放置到本地仓库。
  8. deploy:将已经打包的文件放置到远程仓库。
  9. clean:清除之前构建的内容。
  10. site:针对当前的工程生成一个可视化的站点文档。

常用命令

对应以上生命周期都有一个对应的命令。

  1. mvn compile,编译代码,编译之后代码会出现在/target目录中,整合了IDE会自动执行这个步骤。
  2. mvn test,运行单元测试
  3. mvn test-compile, 编译测试用用欧,并执行。如果在IDE中通过IDE会自定对单元测试代码打包。
  4. mvn package,对项目进行打包,打包之后会出现在/targer目录下。
  5. mvn install,安装包,会将打包之后的包安装到本地仓库对应的位置。
  6. mvn deploy,将包发布到远程仓库。

maven打包基本上就涉及以上命令,除此之外还有一些配套的命令:

  1. mvn site,输出到/target一个依赖视图文档。
  2. ``

Xml文件元素定义

  1. project:整个XML文档的最顶层标签。
  2. modelVersion:使用的maven模型版本<modelVersion>4.0.0</modelVersion>
  3. groupId:组织Id。<groupId>com.mycompany.app</groupId>
  4. artifactId:标识符号id。<artifactId>my-app</artifactId>
  5. packaging:打包模式, 例如JAR, WAR, EAR。<packaging>jar</packaging>
  6. version:当前的版本号。<version>1.0-SNAPSHOT</version>
  7. name:项目名称。<name>Maven Quick Start Archetype</name>
  8. url:项目地址。<url>http://maven.apache.org</url>
  9. description: 项目介绍。

测试用例运行规则

测试用例在运行的时候装载和排除一下格式的文件。 包含:

  1. **/*Test.java
  2. **/Test*.java
  3. **/*TestCase.java

排除:

  1. **/Abstract*Test.java
  2. **/Abstract*TestCase.java

SNAPSHOT(快照版本)

当版本号使用-SNAPSHOT结构的后缀时表示这是一个快照版本。快照版本一般用于开发分支,快照版本即使不改变版本号也会自动获取到最新版本。以只相对的是发布(Release)版本,只要不使用-SNAPSHOT结尾的都是发布版本。每一个发布版本只对应一个编号。

插件使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.3</version>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

上面是在build过程中使用插件的一个配置。插件的使用方式和依赖比较类似,也是2级菜单引入一个插件,插件也是要标记groupIdartifactId以及version等内容。configuration标签用于向插件传递参数(插件就好像一个方法执行一个任务,某些方法需要我们提供参数才能正常运行)。

这个配置会在build阶段被运行(package,install,deploy)。

插件可以在maven执行的各个生命周期被使用。(maven生命周期)插件的类型繁多,除了直接通过<plugin>引入,实际上maven的各种标签功能也是通过插件实现的,需要知道使用某个插件可以查看官方提供的插件清单

## 资源文件管理

一个Java程序肯定会涉及到各种各样的配置文件,在maven的结构下通常我们会将资源文件放置到${root}/src/main/resources目录下。如下面结构的application.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my-app
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- mycompany
    |   |           `-- app
    |   |               `-- App.java
    |   `-- resources
    |       `-- META-INF
    |           `-- application.properties
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java

例如上面这个文件格式,

对于maven项目而言,classpath的根路径是从java开始的,与之对应的,/resources路径也是一个classpath的root,编译或者打包后,会将resource中的文件合并到一个classpath中。如下图的是根据上面的结构打包成JAR之后的文件格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|-- META-INF
|   |-- MANIFEST.MF
|   |-- application.properties
|   `-- maven
|       `-- com.mycompany.app
|           `-- my-app
|               |-- pom.properties
|               `-- pom.xml
`-- com
    `-- mycompany
        `-- app
            `-- App.class

META-INF用于存放程序入口的相关信息,可以将他理解为classpath的一个root,所以在其中的各种配置文件也可以直接在classpath中获取,除此之外还存在MANIFEST.MFpom.propertiespom.xml等几个文件。这些问价那都是maven在package时生成的标准文件,MANIFEST.MF告知了程序的入口,另外两个文件标记了maven的依赖关系。

对应的,也可以在test目录下建立一个resources目录,在执行单元测试的时候,它会被加入到单元测试时的classpath中。

资源文件参数化

通常情况下,发布生产和发布测试某些参数肯定是不一样的(比如数据库链接参数),所以某些时候需要资源文件中的参数根据打包命令进行变更。这个使用会用到<resources>标签(插件)。

替换参数的过程并不复杂,首先是如下图引入<resources>标签。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
  </build>

然后用<directory>表示要进行参数替换的路径位置,这里将会把resource目录中的内容全部替换。

对应的,在配置文件中使用占位符表示要替换的内容:

properties:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
application.name=${project.name}
application.version=${project.version}

yaml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
application:
	name: @project.name@
	version: @project.version@

配置好之后可以通过mvn process-resources命令来检查文件替换的效果。执行后可以到/target/classses看到替换效果。除了使用project.version之类的固定参数,还可以使用<properties>pom.xml文件中定义全局参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<properties>
	<my.value>hello</my.value>
</properties>

最后,maven还支持系统参数和Java运行时参数,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.version=${java.version}
command.line.prop=${command.line.prop}

${java.version}可以获取到操作系统中Java的版本参数。maven本身是一个Java程序,所以mvn process-resources "-Dcommand.line.prop=hello again"命令在启动jvm同时,还传入了command.line.prop的数据。

依赖管理

<dependencies><dependency>组合表示引入依赖。一项依赖通过<groupId><artifactId><version>引入。<scope>用于确定依赖包的使用范围,与maven的运行生命周期相对应。更多的标签说明参见 官网Project Descriptor Reference

依赖范围

  1. compile:这是默认的范围,引入的包会在mvn的整个生命周期内被用到。
  2. provided:在编译和测试的时候都会引入该包,但是到了打包(install)之后的阶段将不会依赖这个包。主要应用场景是使用tomcat之类的容器,在开发和单元测试的时候并不会引入容器,但是需要引用某些包(比如Servlet)完成编译。但是打包放入容器后某些包容器已经提供了,不需要我们带入到classpath中。
  3. runtime:除了编译(compile)阶段,其他阶段都会被引入。
  4. test:仅用于测试。
  5. system:本地操作系统依赖,不会去仓库下载jar包,根据配置的路径(包括网络路径)查找包。
  6. import:导入其他pom文件,该标签仅仅能适用于<dependencyManagement>依赖管理标签中。参考说明

关于maven的依赖机制见官网关于依赖的说明

包引入过程

对于maven而言,一个包最终被引入到项目中有很多层级。首先每个人的操作系统上都有一个本地仓库。在本地执行mvn install命令时都会将对应的包安装到这个仓库中。当其他工程需要这个包时候,maven也是直接到本地仓库获取。

除了自己install的包,更多的时候都是使用第三发提供的包。需要用到某个包时都是先去本地仓路获取,如果不存在maven会到远程仓库去获取。

仓库说明

前面已经提及maven的包加载过程涉及到2个仓路:本地仓库(默认位置:${user.home}/.m2/repository)和远程仓库(默认位置:repo.maven.apache.org/maven2/)。

本地仓路可以通过修改${Maven_HOme}/conf/setting.xml<localRepository>设定,远程仓库通过<mirrors>标签指定。详情见:仓库介绍远程仓库Mirrors配置说明中央仓库结构

发布到远程仓库

发布到远程仓库需要对本地pom.xml以及本机的setting.xml进行配置。 pom.xml文件增加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <distributionManagement>
    <repository>
      <id>mycompany-repository</id>
      <name>MyCompany Repository</name>
      <url>scp://repository.mycompany.com/repository/maven2</url>
    </repository>
  </distributionManagement>

setting.xml配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <servers>
    <server>
      <!-- 使用账号密码登录 -->
      <id>mycompany-repository</id>
      <username>jvanzyl</username>
      <!-- 使用ssh登录 -->
      <privateKey>/path/to/identity</privateKey>
      <passphrase>my_key_passphrase</passphrase>
    </server>
  </servers>

远程服务器的权限有各种各样的规则——参考文件

参考资料:官网介绍

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Amazon云计算AWS(四)
  Amazon提供的两种服务:快速应用部署Elastic Beanstalk、服务模板CloudFormation。
Francek Chen
2025/01/23
3290
Amazon云计算AWS(四)
Amazon云计算AWS(一)
  Dynamo在设计时被定位为一个基于分布式存储架构的,高可靠、高可用且具有良好容错性的系统。下表列举了Dynamo设计时面临的主要问题及所采取的解决方案。
Francek Chen
2025/01/23
3170
Amazon云计算AWS(一)
系统设计:从零用户扩展到百万用户
设计一个支持百万用户的系统是具有挑战性的,这是一段需要不断改进和不断提升的旅程。在本章中,我们将构建一个支持单个用户的系统,并逐渐扩展以服务于数百万用户。阅读本章后,您将掌握一些技巧,帮助您解决系统设计面试问题。
用户8141018
2023/05/28
6160
基于CDN加速后端服务
一、CDN加速原理二、为什么使用CDN加速后端服务三、CDN加速后端服务具体实现四、存在的问题和风险
叔牙
2023/08/09
2.9K0
基于CDN加速后端服务
CloudBluePrint-Chapter 1.4 : 云上应用技术架构- CDN、流媒体、边缘计算
在我们前几章的讨论中,我们已经详细探讨了LNMP、缓存与消息队列,以及负载均衡的各种应用场景和实现方式。这些技术都是构建高效、可扩展和可靠的网络服务的重要工具。然而,随着互联网技术的不断发展,我们面临的挑战也在不断变化和升级。在这一章中,我们将把视线转向更为前沿的技术领域,深入研究CDN、流媒体和边缘计算,并从应用场景的角度进行详细介绍。
行者深蓝
2023/08/29
5570
一篇文章弄懂CDN技术原理
概述 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。
java思维导图
2018/11/08
2.3K0
cdn技术原理
作者:IT世界,来自:www.it.com.cn 1. 前言   Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。解决方案就是在网络传输上利用缓存技术使得Web服务数据流能就近访问,是优化网络数据传输非常有效的技术,从而获得高速的体验和品质保证。   网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转
架构师小秘圈
2018/04/02
4.5K0
cdn技术原理
一文读懂CDN
根据《全球互联网现象报告》,流媒体视频占互联网带宽流量的53.7%,OTT内容的快速增长给现有的基础设施带来了压力,CDN加速变得尤为重要。 4月,谷歌推出了Media CDN 服务,这是一个使用与 YouTube 相同的基础设施来交付内容的平台,旨在为广大客户提供全方位的自动化内容交付体验、让服务内容更加靠近于终端用户。Media CDN 加入了 谷歌 的 Web 和 API 加速 CDN 产品组合,相比于其他的CDN,谷歌声称Media CDN 具有独特之处,例如为个人用户和网络条件量身定制的交付协议
SDNLAB
2022/05/23
2.5K0
一文读懂CDN
DevOps工具介绍连载(19)——Amazon Web Services
很多公司选择AWS作为其IT解决方案,AWS有很多云服务,以下介绍AWS中几类比较重要的服务。
顾翔
2020/03/10
4.3K0
CDN的原理及用途详解
CDN(Content Delivery Network,内容分发网络)是一种利用分布式节点技术,在全球部署服务器,即时地将网站、应用、视频、音频等静态或动态资源内容分发到用户所在的最近节点,以提高用户访问这些内容的速度和稳定性,降低网络拥塞和延迟,同时也能够减轻源站的负载压力,提升网站或应用的可用性和安全性。
炒香菇的书呆子
2024/10/07
4280
【万人收藏】Twitter工程师从0到1教你设计百万级并发应用
万里征途总是从第一步开始的,构建一个复杂系统也是如此。我们从简单的部分着手,先让所有的功能都在一个服务器上运行。图1-1展示了如何配置单台服务器,让一切都在其上运行,包括Web应用、数据库、缓存等。
博文视点Broadview
2024/01/15
2520
【万人收藏】Twitter工程师从0到1教你设计百万级并发应用
什么是CDN(内容分发网络)?
CDN(内容分发网络)是由多个分布式服务器组成的网络,旨在更高效地向用户传输数据和内容。随着互联网的发展,用户对内容访问速度和稳定性的要求越来越高,CDN应运而生。它通过在不同地理位置部署服务器节点,将内容缓存到离用户最近的位置,从而大幅降低延迟,提升访问速度。
是山河呀
2024/10/20
6860
面试前你需要了解的16个系统设计知识
要想在系统设计方面脱颖而出,深入理解一些基本的系统设计概念很有必要,比如:负载平衡、缓存、分区、复制、数据库和代理等。
lyb-geek
2023/12/03
4490
面试前你需要了解的16个系统设计知识
DNS负载均衡与CDN内容分发技术
负载均衡:负载均衡技术能平衡服务器及群众所有的服务器和请求应用之间的通信负载,根据实时响应时间进行判断,将任务交由负载最轻的服务器来处理,以实现真正的智能通信管理和最佳的服务器群性能,从而使网站始终保持运行和保证其可访问性。
全栈程序员站长
2022/09/14
1.9K0
CDN实现原理_快照技术的实现原理
一本好的入门书是带你进入陌生领域的明灯,《CDN技术详解》绝对是带你进入CDN行业的那盏最亮的明灯。因此,虽然只是纯粹的重点抄录,我也要把《CDN技术详解》的精华放上网。公诸同好。
全栈程序员站长
2022/09/20
1.5K0
架构师养成记之全局架构视角下的百万级流量到千万级流量用户的系统设计
        目前,我们尚能在纵向扩展时解决这些问题。不幸的是,解决这些问题的代价变得相当昂贵,并且原来的系统并不能允许在 MySQL 数据库 和 Web 服务器 的基础上进行独立扩展。
睡前大数据
2025/06/23
530
架构师养成记之全局架构视角下的百万级流量到千万级流量用户的系统设计
16 个在面试前需要知道的系统设计概念
英文 | https://levelup.gitconnected.com/16-system-design-concepts-i-wish-i-knew-before-the-interview-b8586e40a73b
winty
2024/05/10
3180
16 个在面试前需要知道的系统设计概念
Amazon云计算AWS(二)
  简单存储服务(Simple Storage Services,S3)构架在Dynamo之上,用于提供任意类型文件的临时或永久性存储。S3的总体设计目标是可靠、易用及低成本。
Francek Chen
2025/01/23
4050
Amazon云计算AWS(二)
Amazon CloudFront 亚马逊云CDN开通和设置网站加速
Amazon CloudFront,是一项快速内容分发网络(CDN)服务,能够以低延迟和高传输速度安全地向全球客户分发数据、视频、应用程序和 API。比如我们可以用于网站、S3对象存储的加速,默认 CloudFront 每个账户拥有每月1TB数据流量。而且,CloudFront 网络拥有超过 225 个节点(PoP),这些节点通过完全冗余的并行 100 GbE 光纤进行连接,可为终端用户提供超低延迟的性能和高可用性。在提供缓存或动态内容时,CloudFront 会自动映射网络状况并智能地路由用户的流量。
老蒋
2023/02/21
9.1K0
Amazon CloudFront 亚马逊云CDN开通和设置网站加速
分布式架构的高性能与可用性
分布式架构是一种将系统拆分为多个独立的组件或服务,并在不同的计算节点上部署这些组件或服务的架构方式。它可以提供高性能和可用性的好处。下面我将详细介绍分布式架构在高性能和可用性方面的优势。
明志德道
2023/12/27
4350
相关推荐
Amazon云计算AWS(四)
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • Maven生命周期阶段
  • 常用命令
  • Xml文件元素定义
  • 测试用例运行规则
  • SNAPSHOT(快照版本)
  • 插件使用
  • 资源文件参数化
  • 依赖管理
    • 依赖范围
    • 包引入过程
    • 仓库说明
  • 发布到远程仓库
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档