Maven笔记

基础

安装

  • 需要java sdk、Maven
  • 如果使用idea安装则没有对path进行写入,需要手动写入。
    • M2_HOME:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\plugins\maven\lib\maven3
    • MAVEN_HOME:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\plugins\maven\lib\maven3
    • Path:%M2_HOME%/bin

配置文件

类型 定义位置
Per Project 在项目中定义的POM文件, pom.xml
Per User 定义在Maven中的设置XML文件(%USER_HOME%/.m2/settings.xml)
Global 定义在Maven中的全局设置xml文件 (%M2_HOME%/conf/settings.xml)
  • src/main/resources有三个特定的文件:
文件名称 描述
env.properties 如果没有配置文件关联则使用默认配置
env.test.properties 当测试配置文件用于测试配置
env.prod.properties 生产配置时,prod信息被使用

代理设置

  • 找到文件
  • {M2_HOME}/conf/settings.xml, 并把你的代理服务器信息配置写入,下面是一个例子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- proxies
| This is a list of proxies which can be used on this machine to connect to the network.
| Unless otherwise specified (by system property or command-line switch), the first proxy
| specification in this list marked as active will be used.
|-->
<proxies>
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>yiibai</username>
<password>password</password>
<host>proxy.yiibai.com</host>
<port>8888</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxies>

本地仓库

  • 默认情况下,Maven的本地资源库默认为 .m2 目录文件夹:

    • Unix/Mac OS X: ~/.m2
    • Windows:${user.home}/.m2/repository
    • PS:我本机的是在C:\Users\admin\.m2
  • 在setting.xml中可以修改这个位置

1
2
3
4
5
6
7
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\software\apache-maven\repository</localRepository>

中央存储库

从Maven远程存储库下载

  • 在Maven中,当你声明的库不存在于本地存储库中,也不存在于Maven中心储存库,该过程将停止并将错误消息输出到 Maven 控制台。
  • 例如在pox.xml中定义下面的库将依赖找不到失败并输出错误消息,需要在repositories中定义url。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependency>
<groupId>org.jvnet.localizer</groupId>
<artifactId>localizer</artifactId>
<version>1.8</version>
</dependency>


<!--添加远程库-->
<repositories>
<repository>
<id>java.net</id>
<url>https://maven.java.net/content/repositories/public/</url>
</repository>
</repositories>
  • 经过上面的修改,Maven的依赖库查询顺序更改为:
    • 在 Maven 本地资源库中搜索,如果没有找到,进入第 2 步,否则退出。
    • 在 Maven 中央存储库搜索,如果没有找到,进入第 3 步,否则退出。
    • 在 java.net Maven的远程存储库搜索,如果没有找到,提示错误信息,否则退出。

使用

依赖机制

  • 传统使用jar需要自己下载、放入项目设置依赖,用maven可以通过设置dependency标签来实现依赖库的下载与更新。
  • 比如在pom.xml中定义依赖log4j,你们在maven编译或构建时就会从中心库下载包到本地库。
  • 如果“version”标签被忽略,它会自动升级库时当有新的版本时。
1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
  • 在这个期间发生的过程就是上面说的,先在本地找,然后去中央库,最后去自定义的远程库中。

依赖传递

  • 问题是:A依赖B,C依赖A,变相的C依赖B。
  • 只需要在每个项目POM定义直接依赖关系。 Maven自动处理其余部分。
  • 下图主要的依赖关系可以通过父POM来管理Libs的依赖,当建立App-UI-WAR项目,Maven会发现所有的依赖通过遍历依赖图和构建应用程序。
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
84
85
86
87
88
89
90
91
92
===================App-UI-WAR===================
<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.companyname.groupname</groupId>
<artifactId>App-UI-WAR</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>

===================App-Core-lib===================
<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>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>

===================App-Data-lib===================
<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>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>

===================Root===================
<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.companyname.groupname</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname1</groupId>
<artifactId>Lib1</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname2</groupId>
<artifactId>Lib2</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname3</groupId>
<artifactId>Lib3</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>

image

自定义jar包到本地maven

  • 使用mvn install命令,然后在pom中使用即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
D:\>mvn install:install-file -Dfile=c:\kaptcha-2.3.jar -DgroupId=com.google.code 
-DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jar
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [install:install-file]
[INFO] Installing c:\kaptcha-2.3.jar to
D:\maven_repo\com\google\code\kaptcha\2.3\kaptcha-2.3.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Tue May 12 13:41:42 SGT 2014
[INFO] Final Memory: 3M/6M
[INFO] ------------------------------------------------------------------------

构建生命周期

命令

  • mvn clean: 情况build的结果,直接看就是删掉了target文件夹。清理生命周期
  • mvn compile:编译项目代码,不编译test代码
  • mvn test: 编译项目和test代码
  • mvn package: 编译项目代码和test代码,生成war或jar包
  • mvn install:编译项目代码和test代码,生成war或jar包,并把它们copy到了repository中。感觉可以上传到远程仓库啊!!
  • mvn deploy: 发布
  • 注意:从compile到deploy是一个完整的默认生命周期,后一个命令会包含前一个命令的操作。比如test即编译了src/main,也编译了test本身。

POM

对于jar包冲突的解决

  • 开发的时候因为要导入jar来帮助编码,但是有时候在部署和运行的时候用的jar包版本冲突,此时对于编码时的jar在设置dependency的时候只要标记scope为provided即可,意味着只在编译和测试的时候用,真正发布后不用。

Scope

插件

  • 一个插件通常提供了一组目标,可使用以下语法来执行:mvn [plugin-name]:[goal-name]

快照

  • 在开发阶段的一个特殊的版本,maven可以在快照有更新时自动获得最新的快照版本。
  • 如果使用版本号则每次更新还需要手动的修改pom文件中的version,在开发阶段是比较麻烦的事情。
  • 在release时需要将快照名称改为正式名称,比如:2.1:-SNAPSHOT 改为2.1

构建自动化

  • pomInclude可以在bus-core-api编译后继续编译别的工程。下面的例子中web和desktop依赖core,最后的编译中先编译core,然后开始编译web和desktop。
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
======================app_web_ui===========================

<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>app_web_ui</groupId>
<artifactId>app_web_ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>app_web_ui</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>bus_core_api</groupId>
<artifactId>bus_core_api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>C:\MVN\bus_core_api\target\bus_core_api-1.0-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
</project>

======================app-desktop-ui===========================

<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>app-desktop-ui</groupId>
<artifactId>app-desktop-ui</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>


======================bus-core-api===========================
<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>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>

======================总线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">
<modelVersion>4.0.0</modelVersion>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-invoker-plugin</artifactId>
<version>1.6</version>
<configuration>
<debug>true</debug>
<pomIncludes>
<pomInclude>app-web-ui/pom.xml</pomInclude>
<pomInclude>app-desktop-ui/pom.xml</pomInclude>
</pomIncludes>
</configuration>
<executions>
<execution>
<id>build</id>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<build>
</project>
# Java
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×