浅墨散人 浅墨散人
  • 基础
  • 设计模式
  • JVM
  • Maven
  • SpringBoot
  • 基础
  • Flask
  • Diango
  • Pandas
  • SqlAlchemy
  • Sqoop
  • Flume
  • Flink
  • Hadoop
  • Hbase
  • Hive
  • Kafka
  • Kylin
  • Zookeeper
  • Tez
  • MySQL
  • Doris
  • Chrome
  • Eclipse
  • IDEA
  • iTerm2
  • Markdown
  • SublimeText
  • VirtualBox
  • WebStrom
  • Linux
  • Mac
  • Hexo
  • Git
  • Vue
  • VuePress
  • 区块链
  • 金融
数据仓库
数据治理
读书笔记
关于我
GitHub (opens new window)
  • 基础
  • 设计模式
  • JVM
  • Maven
  • SpringBoot
  • 基础
  • Flask
  • Diango
  • Pandas
  • SqlAlchemy
  • Sqoop
  • Flume
  • Flink
  • Hadoop
  • Hbase
  • Hive
  • Kafka
  • Kylin
  • Zookeeper
  • Tez
  • MySQL
  • Doris
  • Chrome
  • Eclipse
  • IDEA
  • iTerm2
  • Markdown
  • SublimeText
  • VirtualBox
  • WebStrom
  • Linux
  • Mac
  • Hexo
  • Git
  • Vue
  • VuePress
  • 区块链
  • 金融
数据仓库
数据治理
读书笔记
关于我
GitHub (opens new window)
  • Maven

    • Maven
    • Maven入门-1.介绍及搭建开发环境
    • Maven入门-2.Maven一些核心概念介绍
      • Maven仓库
      • Maven坐标
      • Maven插件和目标
      • Maven生命周期
        • clean:清理项目
        • default:构建项目(重要)
        • site:建立项目站点
      • Maven的依赖
        • 声明依赖
        • 排除不想要的传递性依赖
        • 依赖版本的界限
    • Maven入门-3.pom文件
  • Java
  • Maven
2016-04-21
目录

Maven入门-2.Maven一些核心概念介绍

# Maven仓库

当第一次使用Maven的时候,Maven会从远程仓库http://repo1.maven.org/maven2 下载所需要的jar包到你本地仓库 等下次再获取同样的jar包时,Maven会先从你本地仓库获取,如果本地仓库获取不到,则再从远程下载。

# Maven坐标

Maven通过groupId, artifactId, version和packaging这四个元素定义了项目的坐标,一个坐标就是在Maven空间里的一个点,是不能重复的。它们用来唯一标识一个项目,一个依赖,一个插件 groupId:团体、公司、组织、小组这些名词的逆向命名。例:com.baidu.user artifactId:定义了一个maven项目的一个模块,一般约定为项目名词作为前缀-模块。例:user-core 其中user为项目名,core为模块名 version:定义了当前这个项目的版本。 Maven的版本号约定:<主版本>.<次版本>.<增量版本>-<里程碑版本> 例如:1.3.4-beta-2

  1. 主版本:表示项目的重大变更,例如Maven1到Maven2,Struts1和Struts2
  2. 次版本:表示较大范围的功能增加和bug修复
  3. 增量版本:一般表示重大bug修复
  4. 里程碑版本:表示一个版本的里程碑 但是注意:不是这个四个都必须有的,一般情况多会有主版本和次版本,增量和里程碑版本就不一定了。

packaging:项目打包类型(默认是jar),如果是纯粹管理其他子项目的父项目,这个类型需要为pom

# Maven插件和目标

假如我们现在想通过如下命令来生成一个简单的maven项目

mvn archetype:create -DgroupId=com.baidu.user -DartifactId=user-core -DpackageName=com.baidu.user
1

之前我们说过,Maven自身其实是没做什么实际的事情,一切都是由插件完成的。 像上面的mvn archetype:create 表示运行了archetype插件的create目标。一个插件是一个或多个目标的集合。如下图

一个目标才是一个明确的任务,才是maven执行的命令 其中,目标中定义了一些参数。例如上面命令中的-DgroupId表示参数名称为groupId,值为com.baidu.user 就Maven的本身来说,它并不知道怎么生成一个jar文件,它只是把这些操作代理给了插件完成。 **插件目标速记符号:pluginId:goalId **

# Maven生命周期

Maven的生命周期中包含了一系列插件的目标操作,例如,我们运行一个mvn package命令,这个命令中并没有指定一个插件的目标,就只有一个package命令。 而这个package命令就是生命周期中的一个阶段,每个生命周期中都包含了一些阶段,这些阶段是有依赖关系的。阶段中运行了一系列插件中的目标操作。 在Maven中有三套独立的生命周期:

# clean:清理项目

clean生命周期的目的就是清理项目,包含3个阶段

  1. pre-clean 执行一些清理前需要完成的工作。
  2. clean 清理上一次生成的字节码文件
  3. post-clean 执行一些清理后需要完成的工作

# default:构建项目(重要)

default生命周期定义了真正构建时所需要执行的所有步骤,是最核心的部分。包含阶段如下

validate
initialize
generate-sources
process-sources 主力项目/src/main/resources目录下的资源文件
generate-resources
process-resources
compile 编译项目src/main/java目录下的源代码
process-classes
generate-test-sources
process-test-sources 处理项目src/test/resources目录下的测试资源文件
generate-test-resources
process-test-resources
test-compile 编译项目src/test/java目录下的测试代码
process-test-classes
test 使用单元测试框架运行测试
prepare-package
package 接受编译好的代码,打包成可发布的格式jar,war
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装到Maven本地仓库,供本地其他Maven项目使用
deploy 将最终的包复制到远程仓库中,供其他开发人员和Maven项目使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# site:建立项目站点

site生命周期是建立项目的发布站点,一般开发人员用不到。也就是生成一些站点信息

  1. pre-site 执行生成站点之前需要完成的工作
  2. site 生成项目站点文档
  3. post-site 执行生成站点之后需要完成的工作
  4. site-deploy 将生成的项目站点发布到服务器上

直接使用mvn site命令即可生成一个站点报告。 从命令行执行生命周期的某些阶段,例如: mvn clean :调用clean生命周期的clean阶段,因为有依赖关系,所以实际上是先执行了pre-clean然后才执行的clean阶段 mvn test :调用default生命周期的test阶段,执行test阶段之前就必须执行test之前的那些阶段validate、initialize等等

# Maven的依赖

Maven的依赖通过dependencis元素来配置依赖,这是Maven最强大的特性之一。它支持传递性依赖。 在Maven中一个依赖不仅仅是一个JAR。它是一个POM文件,这个POM可能也声明了对其它构件的依赖。这些依赖的依赖叫做传递性依赖 所谓传递性依赖就是: 如果项目C依赖于项目B,项目B自身依赖于项目A,那么项目C它也依赖于项目A的依赖。 假如你的项目中需要依赖一个A库,这个A库自身又依赖了3个其它库。当你在dependencies中配置了A库的依赖的时候,则Maven会自动依赖3个其他库。不用你再自己去依赖了。就像Spring和Hibernate一样。你配置的时候,只需要配置Spring和Hibernate即可。 Maven在下载相应依赖的jar的时候,还会下载该jar的pom文件。这个文件对于传递性依赖特别重要。 这个pom文件跟我们现在编写的pom.xml文件没太大区别,打开后其实也是一样。 如下是hibernate-core-4.3.10.Final.jar的pom文件(hibernate-core-4.3.10.Final.pom)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>4.3.10.Final</version>
  <dependencies>
    <dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging</artifactId>
      <version>3.1.3.GA</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging-annotations</artifactId>
      <version>1.2.0.Beta1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.jboss.spec.javax.transaction</groupId>
      <artifactId>jboss-transaction-api_1.2_spec</artifactId>
      <version>1.0.0.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
      <scope>compile</scope>
    </dependency>
    **********省略部分***********
  </dependencies>
  <name>Core Hibernate O/RM functionality</name>
  <description>The core O/RM functionality as provided by Hibernate</description>
  <url>http://hibernate.org</url>
  <organization>
    <name>Hibernate.org</name>
    <url>http://hibernate.org</url>
  </organization>
  <issueManagement>
    <system>jira</system>
    <url>https://hibernate.atlassian.net/browse/HHH</url>
  </issueManagement>
  <scm>
    <url>http://github.com/hibernate/hibernate-orm</url>
    <connection>scm:git:http://github.com/hibernate/hibernate-orm.git</connection>
    <developerConnection>scm:git:git@github.com:hibernate/hibernate-orm.git</developerConnection>
  </scm>
  <licenses>
    <license>
      <name>GNU Lesser General Public License</name>
      <url>http://www.gnu.org/licenses/lgpl-2.1.html</url>
      <comments>See discussion at http://hibernate.org/license for more details.</comments>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>hibernate-team</id>
      <name>The Hibernate Development Team</name>
      <organization>Hibernate.org</organization>
      <organizationUrl>http://hibernate.org</organizationUrl>
    </developer>
  </developers>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

# 声明依赖

在Maven中需要使用在dependencies中定义一个或者多个dependency元素,来声明项目的一个或者多个依赖。 每个依赖元素包括:

  1. groupId、artifactId和version依赖的基本坐标
  2. type:依赖的类型,对应项目坐标定义的packaging,默认为jar。大部分情况下不用声明
  3. sope:依赖范围
compile(默认):编译依赖范围
test:测试依赖范围
provided:已提供范围
runtime:运行时依赖范围
system:系统依赖范围
import:导入依赖范围
1
2
3
4
5
6
  1. optional:标记依赖是否可选
  2. exclusions:用来排除传递性依赖

# 排除不想要的传递性依赖

使用provided范围,让它排除WAR文件中特定的依赖。provided范围告诉Maven一个依赖在编译的时候需要,但是它不应该被捆绑在构建的输出中。 当你开发web应用的时候provided范围变得十分有用。 例如:你需要通过Servlet API来编译你的代码,但是你不希望Servlet API的JAR文件包含在你web应用的WEB-INF/lib目录中。因为一般容器中都包含了Servlet API的jar包,以免冲突。所以可以排除它。 现在假如项目A依赖于项目B,但是项目B依赖于项目C,可能项目A就不想因为传递性的问题直接依赖了项目C。则可以排除掉!

<dependency>
    <groupId>com.baidu.user</groupId>
    <artifactId>project-b</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.baidu.user</groupId>
            <artifactId>project-c</artifactId>
        </exclusion>
    </exclusions>
</dependency>
1
2
3
4
5
6
7
8
9
10
11

# 依赖版本的界限

在依赖某个项目的时候,你可以不必指定特定的某个版本。也可以指定一个版本范围 (,) 不包含 [,] 包含 例如:依赖一个Junit的大于等于3.8 但是小于4.0 的版本

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>[3.8 , 4.0)</version>
</dependency>
1
2
3
4
5
#M#a#v#e#n
最后更新时间: 2022/7/23 10:17:11
Maven入门-1.介绍及搭建开发环境
Maven入门-3.pom文件

← Maven入门-1.介绍及搭建开发环境 Maven入门-3.pom文件→

最近更新
01
分区分桶
08-21
02
数据模型(重要)
08-21
03
安装和编译
08-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式