0%

Maven笔记

概述

Maven 是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,
报告和文档的软件项目管理工具。

maven项目结构

1
2
3
4
5
6
7
└─src
| ├─main
| │ ├─java
| │ └─resources
| └─test
| └─java
└─pom.xml

maven的坐标与仓库

maven中任何依赖、插件、项目输出等够成为构件,构件通过坐标唯一标识;
镜像仓库,镜像仓库的修改在maven的conf目录下setting.xml中的mirros节点

1
2
3
4
5
6
7
8
<mirror>
<id>mirrorId</id>
《mirror of标识为那个仓库添加镜像,这里也可以使用 * 代表所有仓库,一旦使用了镜像仓库,所有对原仓库的访问都将转为对镜像仓库的访问》
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
</mirrors>

默认情况下,maven的仓库在C:\Users\Administrator.m2\repostory,一般不将仓库放在C盘,若需要修改位置,修改maven的conf中的settings.xml中

1
<localRepository>D:/SoftWare/ThirdPart4Java/Maven350/Responsitory</localRepository>

pom.xml

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<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>公司网址反写+项目名</groupId>
<!--maven的项目和实际项目并不对应,maven项目对应实际项目的一个模块,即一个实际项目会有多个maven项目-->
<artifactId>项目名-模块名</artifactId>
<!--0大版本号.0分支版本号.1小版本号-->
<!--
snapshot 快照版本
alpha 内部测试版
beta 公测版本
release 稳定版本
GA 正式发布版本
-->
<version>0.0.1-SNAPSHOT</version>
<!--项目打包方式,默认jar,也可以为war/zip/pom等-->
<packaging>jar</packaging>

<!--项目描述名,用于生成相关文档-->
<name>hi</name>
<!--项目地址-->
<url>http://maven.apache.org</url>
<!--项目描述-->
<description></description>
<!--项目开发者-->
<developers></developers>
<!--许可证信息-->
<license></license>
<!--组织信息-->
<organization></organization>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!--依赖列表-->
<dependencies>
<!--每个dependency都表示一个依赖项-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!--scope表示作用范围,Junit仅用于test
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
-->
<scope>test</scope>
<!--依赖项是否可选,默认false,即必须强制引入-->
<optional>true/false</optional>
<!--依赖排除列表,和dependecies类似,内含多个exclusion,注意exclusions在dependency标签内-->
<exclusions></exclusions>
</dependency>
</dependencies>

<!--dependencyManagement模块和dependencices类似,不同之处在于他并不会执行
一般在父模块中定义,用于子模块继承
-->
<dependencyManagement></dependencyManagement>

<build>
<!--插件列表-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--用在子模块中,用于对父模块pom的继承-->
<parent></parent>
<!--聚合多个maven项目,将各模块合并-->
<modules></modules>
</project>

maven项目生命周期

一个完成的项目周期包括:清理clean、编译compile、测试test、打包package、集成测试、验证test、部署deploy

maven的三套生命周期

  1. clean,清理项目

    • pre-clean,执行清理前的工作
    • clean,清理上一次生成的所有文件
    • post-clean, 执行清理后的文件
  2. default,构建项目

    • compile
    • test
    • package
    • install
  3. site,生成项目站点

    • pre-site,生成站点前需要完成的工作
    • site,生成项目的站点文档
    • post-site,生成站点后需要完成的工作
    • site-deploy,发不生成的站点到服务器

mvn基本命令

  1. mvn compile,表示编译项目
  2. mvn test,运行test
  3. mvn package,为项目生成jar或war
  4. mvn clean,删除target文件
  5. mvn install,安装本地jar到目录
  6. mvn archetype:generate,自动创建符合maven要求的目录结构
  7. mvn archetype:generate
    -DgroupId=xxx(这里一般就是组织名,例如公司网址反写+项目名)
    -DartifactId=sss(这里一般是项目在公司的唯一标识,例如项目名-模块名)
    -Dversion=11111 指定版本号
    -Dpackage=dddddd代码所在的包
  8. mvn site, 在target目录生成项目站点文档

maven模板创建Java项目

mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

这告诉 Maven 来从 maven-archetype-quickstart 模板创建 Java 项目。

安装和引用jar包

安装现有jar到本地maven仓库

mvn install:install-file -Dfile=xxx-version.jar -DgroupId=groupId -DartifactId=artifactId -Dversion={version} -Dpackaging=jar

在pom.xml中引用本地仓库包

1
2
3
4
5
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>

运行jar包

用mvn package导出的包中,如果没有在pom文件中将依赖包打进去,是没有依赖包。

  1. 打包时指定了主类,可以直接用java -jar xxx.jar。
  2. 打包是没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)。
  3. 要引用其他的jar包,可以用java -cp $CLASSPATH:xxxx.jar 主类名称(绝对路径)。

生成项目站点文档

mvn site

maven 依赖冲突

例如A/B分别依赖两个不同版本的构建,这里就会存在冲突,maven采用如下的原则

  1. 短路优先,

    • A -> B -> C -> X(jar);

    • A -> D -> X(jar);

      这里,maven将采用第二个路径

  2. 路径相同,则先声明先依赖

maven聚合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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.hongxing</groupId>
<artifactId>hongxing.aggreation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>hongxing.aggreation</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<modules>
<module>../hongxing-bege</module>
<module>../hongxing-nange</module>
<module>../hongxing-shanji</module>
</modules>
</project>

maven继承

新建一个 maven 项目(dependencyManagement 标签中的 dependency 并不会运行)

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
<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.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--这里package定义为pom-->
<packaging>pom</packaging>

<name>hongxing-parent</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--这里定义Junit的版本-->
<junit.version>3.8.1</junit.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--因为在property中定义了该属性,这里就可以向SpEL那样引用-->
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>

另一个项目中

1
2
3
4
5
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>