个人对于 Maven 的理解
个人对于 Maven 的理解
Maven 一直都在使用, 但如果说是不是真的懂 Maven, 很难谈得上. 或许什么时候系统地学习一下, 但在那之前, 打算先记下自己目前对于 Maven 的理解, 之后再进行对比, 看有哪些疏漏和错误.
Maven 基础
最直观的, Maven 使用 pom.xml 文件来管理项目中所使用的依赖, 这跟 Python 的 requirement.txt、JS 的 package.json
或者是 Ruby 的 Gemfile
都类似.
不过, 其他语言的依赖文件规定的往往是某个包的最低版本, 在实际安装的时候, 很可能会安装最新版, 这个时候实际版本会形成另外一个 lock 文件, 像 package.json.lock
. 但是 Maven 不会, 因为在 Maven 的一个依赖节点中, 会要求声明具体的版本.
其次, 因为和构建相关, 所以 pom.xml 中需要声明项目所属的组织、项目的名称、版本, 同时还要在 properties
节点中声明使用的 Java 版本、编码等信息, build
也是经常见到的一个节点, 但我不是很理解它的作用.
<!--项目信息-->
<groupId>域名/项目名</groupId>
<artifactId>项目名/组件</artifactId>
<version>版本</version>
<properties>
<!-- 可以声明编码 -->
<!-- 声明 jdk 版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 可以自定义一些版本值 -->
</properties>
<!-- 一些构建相关的信息 -->
<build>
……
</build>
<!-- 最重要的部分, 列出所依赖的包 -->
<dependencies>
<dependency>
<groupId>域名/项目名</groupId>
<artifactId>项目名/组件</artifactId>
<version>版本</version>
</dependency>
……
</dependencies>
同时, 和其他包管理工具相比, Maven 不像 pip、npm、gem 一样可以使用 install xxxx
命令安装依赖, 而是需要自己向 pom.xml
中添加 <dependency>……</dependency>
节点来添加依赖, 然后执行 mvn install
命令才能安装.
项目名, 包名, 版本号往往琐碎而难以记忆, 所以常常借用现有的 pom.xml
文件; 或者像 Spring initializer
一样生成 pom.xml
文件; 同时也可以依赖搜索引擎, 比如说 Maven Repository Search 就是一个很好用的 Maven 搜索工具.
但在包管理之外, Maven 还可以进编译和打包, Maven 的使用大大简化了项目编译, 打包, 部署的工作量, 因为操作非常简单:
- 运行是
mvn run
, 或者有一些特殊的项目可以定义特殊的启动方式, 如mvn spring-boot:run
命令; - 打包是
mvn package
, 打包之后产生的fat jar package
就可以通过java -jar xx.jar
来运行; mvn clean
命令可以删除掉项目中的target
文件夹, 也就是清除掉所有的编译后的内容.
JSP 项目
而对于传统的项目, 我以前并不太会使用 Maven 处理, 最近有需求之后有这些经验.
一个JSP 项目的 Maven 的典型目录是 java
、resources
、webapp
. 在编译时, webapp 文件夹会成为根文件夹, java
文件夹中代码会被编译成 .class
文件放到 webapp/WEB-INF/lib
中, resources
文件夹和 java
文件夹去的地方一样, 但因为是配置文件, 所以不会被编译.
最最重要的一点, 就是 Maven 如何把这个项目识别成一个传统项目呢, 就是在项目信息下方添加 packaging 信息, 也就是 <packaging>war</packaging>
, 这样, Maven 就会识别 java
、resources
、webapp
的结构了. 在拿到这样一个 xx.war 包之后, 把它拷贝到服务器 Tomcat 的 webapps
文件夹下面, 重启 Tomcat 就可以成功部署.
Spring Boot 项目
我 Spring Boot 相关的项目经验并不多, 仅有的经验是 Spring Boot 项目会在根目录产生 mvnw
脚本, 通过该脚本, 可以使用 mvn spring-boot:run
命令运行项目.
因为 Spring Boot 项目往往具有共享的版本号, 所以可以添加 <parent>...</parent>
节点来一次性指定 Spring Boot 的版本, 之后可以省略.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
</parent>
PS: 在使用 mvn package
时会要求数据库必须有连通性, 所以应当是本地打包完成后再在服务器部署使用.
PS: mvn spring-boot:run
命令为何可用, 是因为 添加以下插件带来的效果.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
个人对于 Maven 的理解的更多相关文章
- Maven基本理解
转 maven(一) maven到底是个啥玩意~ 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就 ...
- Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
- Maven - 深入理解maven构建生命周期和各种plugin插件
作者:亚当-adam 来源:CSDN 原文:https://blog.csdn.net/zhaojianting/article/details/80321488 版权声明:本文为博主原创文章,转载请 ...
- maven简单理解
前言: maven项目也是一个项目,类似于javaProject,javaWebProject,就是多了些功能,其他也没啥,所以大家接触的时候不要害怕! 1 . 帮你下载jar包 maven项目会有一 ...
- maven插件理解
maven插件的主要功能是对用到的jar包进行管理,jar包先从本地仓库中获取,如果没有找到,则从远处中央仓库下载(需要联外网).本地仓库中的jar包可供所有maven工程使用,属于公共模块. mav ...
- maven的理解和使用
一.maven是什么? maven是项目管理工具 二.maven为什么要用? 在做开发的时候常常会用到外部的工具包(jar包),这就需要你一个一个的去他们的官网下工具包,然后在项目里依赖他们,比较的麻 ...
- maven exclusion 理解
结论:exclusion 表示对传递性依赖进行排除,排除后当前项目的依赖jar中,就不会包含该传递性依赖. 扩展:项目中的jar 都会在classpath下,排除后的传递性依赖,相当于在classpa ...
- 理解maven的核心概念
原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 好久没进行java方面的开发了,最近又完成了一个java相关的 ...
- Maven实战:Maven生命周期
前言 之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的. 随着工作的深入,越来越感觉对于Maven的理解 ...
随机推荐
- Magicodes.NET框架之路——让Magicodes.NET帮你编写代码
时间总是过得很快,而我几乎没有时间来安安静静的写博客和完善文档.不过总算是框架在一直前进,而我的计划是在今年年底(公历)前,让此框架成熟稳定. 在很长一段时间里,我尝试了很多我之前没有接触的技术或者没 ...
- MyBatis源码解析(十一)——Parsing解析模块之通用标记解析器(GenericTokenParser)与标记处理器(TokenHandler)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6724223.html 1.回顾 上面的几篇解析了类型模块,在MyBatis中类型模块包含的 ...
- SHELL脚本--简介
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 脚本都以#!/bin/bash开头,“#”称为sharp,“! ...
- 编写你的第一个 Java 版 Raft 分布式 KV 存储
前言 本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目.该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现:该项目 ...
- JDK源码分析(一)—— String
dir 参考文档 JDK源码分析(1)之 String 相关
- [转]windows 10 搭建angular开发环境
本文转自:https://www.cnblogs.com/lilunpai/articles/7992538.html 一.环境介绍 1.开发环境:Windows10 2.开发ide工具:VS cod ...
- PHP之单例模式
之前记得有写过PHP的几种这模式.这几天看群里在问单列模式,觉得还是有必要再深入写清楚下..其实单例模式很好理解滴哦 单例模式顾名思义,就是只有一个实例,作为对象的创建模式,单例模式确保某一个类只有一 ...
- Aurelia 创建模板
今天介绍一下Aurelia创建模板的三种方式. 模板既可以作为页面也可以作为组件. 1. View+View Model Aurelia的模板通常由一个html文件和一个同名的ts或js文件组成,文件 ...
- BZOJ3453: tyvj 1858 XLkxc(拉格朗日插值)
题意 题目链接 Sol 把式子拆开,就是求这个东西 \[\sum_{i = 0} ^n \sum_{j = 1}^{a + id} \sum_{x =1}^j x^k \pmod P\] 那么设\(f ...
- P3275 [SCOI2011]糖果
题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...