喜欢就点个赞呗!

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

参考

关注微信公众号,随时移动端阅读

Apache Maven从入门到升天的更多相关文章

  1. Apache Maven的入门使用之常用操作以及核心概念介绍(2)

    我们接着上篇文章,来继续介绍Maven中几个核心的概念: POM (Project Object Model) Maven 插件 Maven 生命周期 Maven 依赖管理 Maven 库 POM ( ...

  2. Apache Maven的入门使用之项目的基本构建(1)

    前言 最近在研究java框架struts2的相关漏洞,然后就去看了官方给出的文档.在看文档的过程中发现使用到了Apache Maven这个项目管理工具,我在网上搜索了一下,大多数文章都写得不是很系统, ...

  3. [Maven]Apache Maven 入门篇

    作者:George Ma 上 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 ma ...

  4. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  5. [转]Apache Maven 入门篇 ( 上 )

    原文地址:Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这 ...

  6. [转]Apache Maven 入门篇(下)

    原文地址: Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点 ...

  7. Apache Maven 入门

    Apache Maven 入门篇 ( 上 ) Apache Maven 入门篇 ( 下 ) ~$mvn archetype:generate -DgroupId=com.mycompany.hello ...

  8. 【Tools】Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 mave ...

  9. Apache Maven入门篇(转)

    [上篇] 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这个入门篇分上下两篇.本文着重动手,用 maven 来构建运行 ...

随机推荐

  1. sshd服务以及基于口令的远程登陆

    ssh用为客户端,主要进行服务器端的连接:sshd用为服务器端 几个常用的命令: systemctl              ##服务控制命令   systemctl start sshd   ## ...

  2. vue 实现单选/多选效果

    转:https://blog.csdn.net/Number7421/article/details/81002729 不过我以前都写过这三种方法了,很pang额,怕之后忘记了,偷个懒拿别人的,以免以 ...

  3. 通过javascript 执行环境理解她

    古往今来最难的学的武功(javascript)算其一. 欲练此功必先自宫,愿少侠习的此功,笑傲江湖. 你将了解 执行栈(Execution stack) 执行上下文(Execution Context ...

  4. 力扣(LeetCode)两整数之和 个人题解

    不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a .b ​​​​​​​之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = ...

  5. Vue导入非模块化的第三方插件功能无效解决方案

    一.问题: 最近在写vue项目时,想引入某些非模块化的第三方插件时,总是发现会有报错.且在与本地运行插件测试对比时发现插件根本没有注入到jQuery中(console.log($.fn)查看当前jq有 ...

  6. PL真有意思(三):名字、作用域和约束

    前言 这两篇写了词法分析和语法分析,比较偏向实践.这一篇来看一下语言设计里一个比较重要的部分:名字.在大部分语言里,名字就是标识符,如果从抽象层面来看名字就是对更低一级的内存之类的概念的一层抽象.但是 ...

  7. goland_beego框架学习--api实现

    goland_beego框架学习--api实现 完成一项api实现的流程 (1)beego框架的router层里面注册路由 正则路由 为了用户更加方便的路由设置,beego 参考了 sinatra 的 ...

  8. nginx支持wss配置

    nginx证书 nginx.conf配置

  9. 微服务 consul使用

    前言 常见的注册中心有zookeeper .eureka.consul.etcd.从生态发展.便利性.语言无关性等角度来综合考量,选择consul,多数据中心支持,支持k-v能力,可扩展为配置中心.g ...

  10. es3设置属性不能修改

    /*es3*/ { var Person =function () { var data ={ name:'zs', sex:'男', age:18 } this.get=function (key) ...