Maven基础及概念

前言

今天就来聊聊Maven的基础和一些比较概念性的东西,还有一些常用的Maven命令啥的,主要是某人脑子记不住,记在博客中让她自己看吧,省的费心给她找。

后续的文章会聊到Maven的一些比较高级用法,像自定义插件,私服啥的,欢迎各位大佬来讨论哦!

概念

Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。

在有多个开发团队环境的情况下,Maven 能够在很短的时间内使得每项工作都按照标准进行。因为大部分的工程配置操作都非常简单并且可复用,在创建报告、检查、构建和测试自动配置时,Maven 可以让开发者的工作变得更简单。

Maven 的主要目的是为开发者提供

  1. 一个可复用、可维护、更易理解的工程综合模型
  2. 与这个模型交互的插件或者工具

Maven 工程结构和内容被定义在一个 xml 文件中(即谈到的pom.xml)

安装配置

Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。

官网下载后解压即可,一般都是在开发工具里面配置Maven的位置就可以了,如果喜欢敲命令的话,那就添加一下环境变量。

然后配置一下本地仓库地址和镜像仓库,提供一下示例:

maven下载地址:Maven – Download Apache Maven 

JDK原生打包

在Maven工具出现之前,基本上用的都是Ant(打包构建项目工具)打包,由于现在Maven越来越流行,使用Ant打包的项目就越来越少了,这些工具基本上都是通过对JDK原生打包的方式进行了一层封装,编译打包底层还是基于JDK带有的工具实现的。

现有一个demo测试项目,结构路径如下:

 我们进入到这个src的目录里面,使用命令进行编译:

 编译好后就可以进行打包成jar包文件了,jar文件又分为两种,一种是直接被引用的jar包,另外一种是可以直接执行的可执行jar包,打包命令如下:

 这时打的包仅是一个普通的jar包,如果要打成可执行包的话,那么就得引用一个MANIFEST.MF文件了,JDK也是根据这个文件加载相关的类信息的,新建一个manifest.txt文件,内容如下(每个冒号后面都需要有空格,每行都需换行)

Manifest-Version: 1.0
Created-By: 1.8.0_101 (Oracle Corporation)
Main-Class: com.compile.App

执行一下命令

这样打出来的jar包就是可执行包啦。使用以下命令启动jar包

 java -jar compile.jar

使用Maven打包

我们需要创建一个Maven Project项目,我们这里使用quickstart原型(快速创建)

创建好后再pom.xml里面的build标签里面添加Maven打包插件,如果不需要可执行jar包的话,把configuration标签去掉就好了

 POM结构

先放在这里,起码有个概念,会在后面的博文中讲到

 Maven项目结构

项目结构是一个约定好了的目录,如果有些改动的话,可能项目都不能正常运行或打包(博主碰到过一次,贼难受)

约定的目录(不可改):

src/main/java –存放项目的.java文件

src/main/resources –存放项目资源文件。比方Spring,Mybatis配置文件

src/test/java –存放全部测试.java文件,比方JUnit測试类

src/test/resources ---测试资源文件

target ---项目输出位置,编译完毕后的东西放到这里面

pom.xml

Maven生命周期

在 Maven的的生命周期里面,理想的标准构建流程为:清理->编译 -> 测试 -> 报告 -> 打包 -> 部署。并且在一个pom.xml里面全部搞定

而Maven只是一个抽象规范流程,每个周期里面的流程是有具体的插件来执行的

 而每个生命周期的预设如下:

阶段处理描述
验证 validate验证项目验证项目是否正确且所有必须信息是可用的
编译 compile执行编译源代码编译在此阶段完成
测试 Test测试使用适当的单元测试框架(例如JUnit)运行测试。
包装 package打包创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify检查对集成测试的结果进行检查,以保证质量达标
安装 install安装安装打包的项目到本地仓库,以供其他项目使用
部署 deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

运行任何一个阶段,都会从其所在生命周期的第一个阶段开始,顺序执行到指定的阶段,如:

mvn package  --- 本义:执行default周期的package阶段,maven会自动从process-resources阶段开始运行到package阶段结束

Maven插件

插件plugin是绑定到生命周期,承担实际功能的组件。mvn运行时,自动关联插件来运行

下图是maven默认的各阶段对应的插件列表:

生命周期

生命周期阶段

插件目标

执行任务

clean

pre-clean

clean

maven-clean-plugin:clean

删除项目的输出目录。

post-clean

site

pre-site

site

maven-site-plugin:site

post-site

site-deploy

maven-site-plugin:deploy

default

process-resources

maven-resources-plugin:resources

复制主资源文件至主输出目录

compile

maven-compiler-plugin:compile

编译主代码至主输出目录

process-test-resources

maven-resources-plugin:testResources

复制测试资源文件至测试输出目

test-compile

maven-compiler-plugin:testCompile

编译测试代码至测试输出目录

test

maven-surefire-plugin:test

执行测试用例

package

maven-jar-plugin:jarejb:ejb jar:jar rar:rar war:war

创建项目jar

install

maven-install-plugin:install

将项目输出构件安装到本地仓库

deploy

maven-deploy-plugin:deploy

将项目输出构件部署到远程仓库

Maven常用命令

mvn clean  执行清理阶段生命周期

mvn compile 执行编译阶段生命周期

mvn package 执行打包阶段生命周期

mvn install 安装jar到本地库

mvn dependency:tree 将当前项目pom.xml中引入的依赖打印出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven之pom.xml常用标签解析及镜像配置

前言 Maven仅仅是个打包工具而已,个人觉得没有太大必要花费在打包工具上,这里就列举一下个人觉得会常用标签的使用就好了,原理啥的基本就不太会去深度了解了,如果以后遇到需了解Maven工作原理的工作的话,到时候一定分…

Maven高级之插件开发

前言 终于来到了Maven的插件开发,其实Maven的插件并没有想象的那么难,刚开始讲Maven基础的时候就演示了一下JDK是如何打包的,Maven打包只是在JDK打包上封装了一层而已,Maven也支持自定义插件开发 创建 我们先使用quickstart原型…

Maven高级之archetype(原型/骨架)开发

前言 archetype这个的主要功能就是将写好的项目模块打包成一个原型,然后提供给其他人使用,这样别人就可以快速使用这个项目模板了。 这个东西虽然很多人都基本用不上,但原型这个东西用的好还是很方便的,能够在开发新项目上省去大…

深度学习在搜索业务中的探索与实践

本文根据美团高级技术专家翟艺涛在2018 QCon全球软件开发大会上的演讲内容整理而成,内容有修改。引言 2018年12月31日,美团酒店单日入住间夜突破200万,再次创下行业的新纪录,而酒店搜索在其中起到了非常重要的作用。本文会首先介绍…

SpringBoot自动配置原理流程

前言 新公司太忙了,都没啥空更新博客,就随便记录一下以前的学习笔记吧。SpringBoot是基于Spring上的衍生框架,只要看懂了Spring的话,学这个就比较简单了;SpringBoot也是在当前微服务时代下流行的框架,并且…

SpringBoot自定义Starter(自动配置类)

前言 SpringBoot其实从诞生以来围绕的核心就是快速构建项目,快速构建的前提是有人帮你做好轮子,开发者只要拿来即用就好了,而造好轮子的人就是SpringBoot的开发者,引入自动配置的形式帮助开发者快速创建项目,而自动配…

Java并发编程之synchronized关键字解析

前言 公司加班太狠了,都没啥时间充电,这周终于结束了。这次整理了Java并发编程里面的synchronized关键字,又称为隐式锁,与JUC包中的Lock显示锁相对应;这个关键字从Java诞生开始就有,称之为重量级锁&#xf…

通过代理模式 + 责任链模式实现对目标执行方法拦截和增强功能

前言 最近需要实现一个插件功能,但是如果做成两个接口的话(即执行前和执行后),那么会降低插件的可玩性,所以需做成类似AOP的环绕通知形式,所以就使用到了责任链模式和代理模式进行实现。 介绍 代理模式(P…

vscode Go 1.11.4 编译错误 need Delve built by Go 1.11 or later

更新golang的版本为1.11.4之后vscode编译错误:executables built by Go 1.11 or later need Delve built by Go 1.11 or later 原因是delve的版本太老了,需要更新,且delve的github地址已经更换,很多教程里的地址是不对的 新地址安…

Navicat使用教程:使用Navicat Query Analyzer优化查询性能(第1部分)

下载Navicat Monitor最新版本Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona Server,并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure …

第一家云创大数据产业学院在佛山职业技术学院挂牌

2019年1月10日,“云创大数据产业学院揭牌暨战略合作协议签署仪式”在佛山职业技术学院电子信息学院会议室举行。云创大数据总裁刘鹏教授、市场部经理单明月,佛山职业技术学院电子信息学院院长唐建生、副院长田钧、学院办公室主任赵雪章、信息工程系主任乔…

String与StringBuffer和StringBuilder的根本区别

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

前端Http协议缓存初解

[TOC] 简介 用户获取网络资源,需要通过非常长的网络去服务器上请求资源,另外服务端为了应对大量的用户请求而不断的提升硬件性能与带宽。这对用户与服务端都非常的不友好。而缓存就是为了解决用户请求速度与释放服务器压力而生的。 为什么我会写Http缓存&#xff0c…

详解java访问修饰符

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

企业为什么要做SEO,它的重要性有哪些?

对于SEO工作而言,我们知道一个网站做SEO的基础诉求就是让用户和搜索引擎更好的理解网站内容,虽然随着搜索引擎算法技术的迭代,目前SEO面临更大的挑战与竞争,但基于搜索营销,它目前仍然显得十分重要。 那么&#xff0…

白话说编程之java线程

白话说编程之java线程线程和进程:进程:线程:线程和进程的区别:详解多线程:并发为什么使用并发并发的执行原理并行线程的五种状态:创建状态:就绪状态:运行状态:阻塞状态:死…

powerdesigner显示工具面板_photoshop教程-画笔工具预设与选项设置

定义画笔预设在打开的“画笔”面板中,单击左侧的“画笔笔尖形状”名称,可显示笔尖形状图案。单击“画笔”面板左侧其他不同的选项名称,在右侧就会显示其对应的调节项。只单击不同选项前面的方框,可使此选项有效,但右侧…

深入理解== 和 equals 的区别

深入理解 和 equals 的本质区别简介区别:图解:注意点:源码分析:总结分享一波:程序员赚外快-必看的巅峰干货简介 初学者常常被" “和‘equals ’所折磨,为什么,因为他们的大概意思相同,都是…

java sleep和wait区别

为什么80%的码农都做不了架构师?>>> 关于sleep和wait区别解析: sleep只是释放CPU资源,并不释放资源锁对象,wait是会释放掉资源锁对象。 比如,有个锁对象object,线程1和线程2都会锁住object对象…

深入理解equals和hashCode关系和区别

深入理解equals和hashCode关系和区别直入主题:区别:1.他们判断对象相同的方式不一样:2.他们判断对象是否相等的准确率不一样:改写equals时总是要改写hashcode分享一波:程序员赚外快-必看的巅峰干货为什么要说equals和hashCode这两…