Apache Maven从入门到升天
喜欢就点个赞呗!
GitHub项目JavaHouse同步收录
1 引入
在日常 Java 开发中,Maven 应该是必不可少的一个工具了,当然也有人使用 Gradle 的。那么 Maven 究竟是个啥东西呢?不就是一个依赖引入工具吗?我相信很多人和我是一样的感觉。但是一般而言,感觉的东西往往是不可靠的。我在网上收集一些资料,翻翻官网,重新整理了一下 Maven 的资料。
2 Maven 简介
维基百科上面说 Maven 是一个软件项目管理和自动构建工具。单从字面意思来看,我是不知道这是想要表达什么意思的。按照我的理解,Maven 其实就是一个开发工具,跟 IDEA 相辅相成。我们日常使用 IDEA 的编译项目的时候,其实就是在使用 Maven,只不过这些操作都被强大的 IDEA 隐藏了,造成我们在使用 IDEA,和 Maven 没有联系的错觉。
3 Maven 的命令
说命令行之前,容我说手几个专业的名词。
名称 | 解释 |
---|---|
groupId | 包名 |
artifactId | 项目名称 |
groupId 的 artifactId 被人们称为坐标,确实也是,一旦他们的值确定了,我们就可以根据他们的坐标找到他们。
创建
mvn -B archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app
-Dartifac t Id=my-app
这样maven就自动创建了一个带有 hello world 的 Maven 项目。包名是 com.mycompany.app; 项目名是 my-app。看到这里,我们就知道为什么 Maven 是项目构建工具了。我个人觉得 Maven 跟大前端的 npm 工具有相似的地方。
编译
mvn compile
该命令从字面意思流知道是编译命令,他是不是编译 test 文件夹里面的源码的。执行该命令就会生成一个 target 文件。文件夹里面就是编译后的内容。
清除
mvn clean
该命令主要是清除编译后产生的 target 文件夹。
打包
mvn package
该命令会将项目默认打成 jar 包,当然我们就也可以打成 war 包。
安装
mvn install
该命令可以把项目打成 jar,放到本地仓库。
4 仓库
要理解 Maven,仓库概念是必不可少的。让我(灵魂画手)画个图。
项目需要的依赖都是从本地仓库里面拿到的,本地仓库就是自己的电脑,我们引入的各种依赖都放在本地仓库里面,一般依赖有问题的话,就是本地仓库的依赖没有。我们可以先把本地的对应的依赖删除,在试试,或许就可以了。
从中,我们可以看到自建仓库,也就是我们说的私服,可以存放一些我们开发的基础包,从自建仓库引入依赖就比较快的,当然如果自建仓库里面没有我们需要的依赖,自建仓库就会发出请求,请求远程的中央仓库,中央仓库没有那就真的没有了。
5 POM
现在是我们的重要任务出场了--POM. Maven 项目都会有一个 pom.xml 文件。
这是一个最简单的 pom 文件。这个 pom 文件应该我们很熟悉了,引入依赖就是从这里引的。没什么好说的,所以说些其他的。
包类型
// war
<packaging>jar</packaging>
该标签决定项目是 jar 包或者 war 包。一般来说,SpringBoot 项目会打成 war 包,然后放进 tomcat 运行。当然也可以 jar 包运行,毕竟 SpringBoot 内置了tomcat ,强的一批。
加进来
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
如果我们把一下文件,例如 xml 后缀的 mapper 文件放在 resources 里面,编译的时候会发现他们没有编译进去,是因为 标签默认是 false,我们需要 true。
去掉他
<exclusions>
<exclusion>
<groupId>sample.ProjectE</groupId> <!-- Exclude Project-E from Project-B -->
<artifactId>Project-E</artifactId>
</exclusion>
</exclusions>
部署到远程
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
当我们造好轮子之后,想部署到远程中央仓库,就添加上面标签。同时在 setting.xml(Maven 安装的目录下)添加以下
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
多个模块
如果我们想一次建造几个maven项目,也是没有问题的。比如有两个模块(my-app、my-webapp),目录如下
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
在顶层 pom.xml 需要添加 标签,如下
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>
然后选一个做老大(webapp),在他的 pom 文件里加入 my-app 的依赖
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
然后再这两个项目(webapp、my-app)的 pom 文件里面加入顶层的 标签
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...
最后执行 mvn verify 命令,就会在老大项目(webapp)的 target 文件夹里生成 war 包。
参考
- https://zh.wikipedia.org/wiki/Apache_Maven
- https://maven.apache.org/
- https://maven.apache.org/guides/getting-started/index.html
- https://maven.apache.org/guides/mini/guide-configuring-maven.html
- https://www.cnblogs.com/luotaoyeah/p/3791966.html
关注微信公众号,随时移动端阅读
Apache Maven从入门到升天的更多相关文章
- Apache Maven的入门使用之常用操作以及核心概念介绍(2)
我们接着上篇文章,来继续介绍Maven中几个核心的概念: POM (Project Object Model) Maven 插件 Maven 生命周期 Maven 依赖管理 Maven 库 POM ( ...
- Apache Maven的入门使用之项目的基本构建(1)
前言 最近在研究java框架struts2的相关漏洞,然后就去看了官方给出的文档.在看文档的过程中发现使用到了Apache Maven这个项目管理工具,我在网上搜索了一下,大多数文章都写得不是很系统, ...
- [Maven]Apache Maven 入门篇
作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...
- Apache Maven 入门篇 ( 上 )
作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...
- [转]Apache Maven 入门篇 ( 上 )
原文地址:Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这 ...
- [转]Apache Maven 入门篇(下)
原文地址: Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点 ...
- Apache Maven 入门
Apache Maven 入门篇 ( 上 ) Apache Maven 入门篇 ( 下 ) ~$mvn archetype:generate -DgroupId=com.mycompany.hello ...
- 【Tools】Apache Maven 入门篇 ( 上 )
作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 mave ...
- Apache Maven入门篇(转)
[上篇] 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 maven 来构建运行 ...
随机推荐
- 模块参数,系统调用,字符设备编程重要数据结构,设备号的申请与注册,关于cdev的API
1.模块参数 应用编程: int main(int argc, char *argv[]) { } ./a.out xxx yyy zzz ...
- K8S入门系列之集群二进制部署-->node篇(三)
node节点组件 docker kubelet kube-proxy kubernetes-server-linux-amd64.tar.gz(相关的这里都能找到二进制文件!) falnnel 1. ...
- Ansibile之playbook初识
一.playbook简介 ansiblie的任务配置文件被称为playbook,俗称“剧本”,每一个剧本(playbook)中都包含了一系列的任务,这每个任务在ansible中又被称为“戏剧”(pla ...
- [javascript] 编写一个计算器,实现加减法
1.代码 <script> function sum(){ //加法 var value1 = document.getElementById("num1").valu ...
- thinkphp 获取前端传递过来的参数
thinkphp 获取前端传递过来的参数 use think\facade\Request; // 获取当前请求的name变量 Request::param('name'); // 获取当前请求的所有 ...
- # & 等特殊字符会导致传参失败
# & 等特殊字符会导致 post 传参失败 处理方法使用 encodeURIComponent 将字符串转化一下 实例 // toUpperCase() 转化为大写字母 var cateco ...
- nyoj 60-谁获得了最高奖学金 (逻辑判断)
60-谁获得了最高奖学金 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:8 submit:17 题目描述: 某校的惯例是在每学期的期末考试之 ...
- [ch02-00] 反向传播与梯度下降的通俗解释
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 第2章 神经网络中的三个基本概念 2.0 通俗地理解三大 ...
- 【PostMan】批量参数化的用法 之 text/csv
目的:批量参数化,单个循环多次使用不同的参数请求. 测试数据准备 新建txt文件,输入格式: 首行 --->参数名 其他行 --->测试数据(不同测试数据需要换行) 如下所示,Number ...
- opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)
离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...