0%

maven笔记

1
2
3
4
5
6
作者: 夜泊1990
企鹅: 1611756908
鹅群: 948233848
邮箱: hd1611756908@163.com
博客: https://hd1611756908.github.io/
B 站: https://space.bilibili.com/514155929/

第一章 Maven介绍

1
maven是一个采用纯Java编写的开源项目管理工具。采用了一种被称之为POM(project object model)概念来管理项目,所有的项目配置信息都被定义在一个叫做pom.xml的文件中,通过该文件,maven可以管理项目的整个生命周期,包括编译,测试,打包,发布,运行等等。目前Apache下绝大多数项目都已经采用maven进行管理。而maven本身还支持多种插件,可以方便,灵活的控制项目。一句话:maven是一个项目管理和构建工具,主要对项目做编译,测试,打包,发布,运行等操作。

第二章 Maven安装

下载

1
http://maven.apache.org/

环境配置

1
2
3
和JDK的环境配置类似
MAVEN_HOME=maven安装路径
path=%MAVEN_HOME%\bin

第三章 Maven项目创建

3.1 命令创建

普通Java工程

1
2
3
4
5
6
7
8
9
mvn archetype:generate -DgroupId=com.qianfeng -DartifactId=myapp01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

mvn: 指定使用maven构建工具
archetype:generate :原型生成器
-D : pom.xml文件中的一个属性,如果不存在就生成,如果存在就覆盖
groupId: 项目属于哪个组
artifactId:项目名称
archetypeArtifactId: 指定插件
interactiveMode: 是否开启交互模式

JavaWeb工程

1
mvn archetype:generate -DgroupId=com.qianfeng -DartifactId=mywebapp01 -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

3.2 集成开发工具

1
演示集成Eclipse和IDEA

第四章 阿里云私服配置

4.1 阿里云Maven私服配置

1
2
3
4
5
6
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

4.2 修改本地(.m2)仓库

1
2
3
4
5
6
7
Maven的第一次运行命令的时候会从云端下载很多的文件,这些文件都保存到了我们本机的.m2这个maven的默认仓库里,这个仓库默认在windows电脑的C盘用户目录下,随着添加的依赖越来越多,这时候这个文件夹会越来越大,所以可以重新指定默认本地仓库的位置.

设置方式:
1. 找到我们Maven的安装位置
2. 里面有一个conf文件夹
3. conf里面有一个settings.xml文件
<localRepository>D:\soft\maven_repository</localRepository>

第五章 Maven依赖特性

5.1 依赖范围介绍

1
2
3
4
5
6
7
8
9
10
11
12
maven 项目不同的阶段引入到classpath中的依赖是不同的,例如,编译时,maven 会将与编译相关的依赖引入classpath中,测试时,maven会将测试相关的的依赖引入到classpath中,运行时,maven会将与运行相关的依赖引入classpath中,而依赖范围就是用来控制依赖于这三种classpath的关系.

例子:

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

其scope标签就是依赖范围的配置,默认是compile,可选配置有test、provided、runtime、system、import

5.2 依赖范围分类

  • 编译依赖范围(compile)
    1
    该范围就是默认依赖范围,此依赖范围对于编译、测试、运行三种classpath都有效,举个简单的例子,假如项目中有spring-core的依赖,那么spring-core不管是在编译,测试,还是运行都会被用到,因此spring-core必须是编译范围(构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定)
  • 测试依赖范围(test)
    1
    2
    3
    4
    5
    6
    7
    8
    使用此依赖范围的依赖,只对测试classpath有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为<scope>test</scope> ,当然不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的classpath中,造成不必要的浪费

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
  • 已提供依赖范围(provided)
    1
    2
    3
    4
    5
    6
    7
    8
    使用该依赖范围的maven依赖,只对编译和测试的classpath有效,对运行的classpath无效,典型的例子就是servlet-api, 编译和测试该项目的时候需要该依赖,但是在运行时,web容器已经提供的该依赖,所以运行时就不再需要此依赖,如果不显示指定该依赖范围,并且容器依赖的版本和maven依赖的版本不一致的话,可能会引起版本冲突,造成不良影响

    <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    </dependency>
  • 运行时依赖范围(runtime)
    1
    2
    3
    4
    5
    6
    7
    8
    使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动

    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    <scope>runtime</scope>
    </dependency>
  • 导入依赖范围(import)
    1
    该依赖范围不会对三种classpath产生影响,该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中
  • 系统依赖范围(system)
    1
    该依赖与classpath的关系与 provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量

5.3 依赖传递

1
假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A。那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性

5.4 依赖传递的排除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
如上,C—>B—>A。加入现在不想执行C时把A下载进来,那么我们可以用<exclusions>标签

<dependencies>
<dependency>
<groupId>com.sc.</groupId>
<artifactId>B</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<!--被排除的依赖包坐标-->
<groupId>com.sc.</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
</exclusion>
</exclusions>
</dependency>
</dependencies>

5.5 依赖冲突与解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?

冲突解决方案:

1:如果依赖路径的长度不同,则“短路优先”:

A—>B—>C—>D—>E—>X(version 0.0.1)

A—>F—>X(version 0.0.2)

则A依赖于X(version 0.0.2)。

2:依赖路径长度相同情况下,则“先声明优先”:

A—>E—>X(version 0.0.1)

A—>F—>X(version 0.0.2)

则在项目A的<dependencies></dependencies>中,E、F哪个在前则A依赖哪条路径的X

5.6 继承

1
继承,和java中的继承相当,作用就是复用
  • 父类是dependencies标签
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    当父类使用dependencies管理依赖时,子类可以直接继承父类的所有依赖

    <dependencies>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    <scope>runtime</scope>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

  • 父类是dependencyManagement标签
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    当父类使用dependencyManagement管理依赖时,父类的依赖不会直接继承到子类,子类还需要添加依赖,但是版本不需要添加,父类会统一管理版本,这样可以灵活控制依赖,避免没有必要的依赖也被子类继承过去.


    父类:
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    子类:
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

5.7 import使用

1
2
3
4
5
6
7
8
9
10
11
import只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中

例如:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.10.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>

5.8 properties属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
通过<properties>元素用户可以自定义一个或多个maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理.


<properties>
<!-- 定义 spring版本号 -->
<spring.version>4.3.10.RELEASE</spring.version>
</properties>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<!-- 使用${}引入 -->
<version>${spring.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>

第六章 Maven的常见命令

1
2
3
4
5
6
7
8
1、mvn compile 编译,将Java 源程序编译成 class 字节码文件。
2、mvn test 测试,并生成测试报告
3、mvn clean 将以前编译得到的旧的 class 字节码文件删除
4、mvn pakage 打包,动态 web工程打 war包,Java工程打 jar 包。
5、mvn install 将项目生成 jar 包放在仓库中,以便别的模块调用

命令还可以连着一起使用
mvn clean install -Dmaven.test.skip=true

第七章 Maven的插件介绍

1
2
3
4
5
6
7
8
9
10
11
jetty插件,功能和tomcat类似,一个web服务器插件

<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
</plugin>
</plugins>

修改启动端口号命令: mvn -Djetty.port=9999 jetty:run 对应此版本

第八章 Maven私服安装和配置

  • windows系统下进行安装
    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
    windows下安装版本 nexus-2.14.14-01-bundle.zip,如果需要安装包,登陆官网获取,或者加群联系群主

    1. 解压之后的nexus目录结构
    |--nexus-2.5.0-04
    |--bin
    |--jsw(这里面是 不同系统版本下的脚本)
    |--nexus(lunix支持 install uninstall start stop 四个命令)
    |--nexus.bat(windows 同上)
    |--conf
    |--examples
    |--jetty.xml
    |--logback.xml
    |--nexus.properties(只用修改这里面的项目及主要是jetty bind的IP和端口)
    |--lib(nexus web工程需要的Jar包)
    |--logs(日志输出目录)
    |--nexus(nexus war包解压后)
    |--tmp(tmp)
    |--LICENSE.txt
    |--NOTICE.txt
    |--sonatype-work

    2. 注册服务,将解压之后的nexus注册到windows服务中
    在bin目录下执行
    nexus install 注册为服务
    nexus uninstall 删除服务

    3. 修改端口号
    在nexus-2.14.14-01-bundle\nexus-2.14.14-01\conf\nexus.properties修改端口号为: application-port=8081

    4. 启动nexus
    在bin目录下执行 nexus start 命令启动服务

    错误解决:

    出现错误
    Started as Service
    Launching a JVM...
    Unable to execute Java command. 系统找不到指定的文件。 (0x2)

    说明JDK安装路径和nexus指定的jdk执行路径不相同导致

    解决方式:
    在Nexus安装目录下,找到【\~\bin\jsw\conf】文件夹,打开【wrapper.conf】文件
    找到 # Set the JVM executable
    设置 wrapper.java.command=jdk的java命令的地址
    比如: wrapper.java.command=C:\soft\Java\jdk1.8.0_171\bin\java

    修改完成重新启动:

    访问:
    http://127.0.0.1:8081/nexus
    用户名: admin 密码: admin123
  • 其他操作系统(略)
    1
    其他操作系统安装方式,请参考官网

第九章 Maven私服相关的常见配置

9.1 从私服获取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
如果只是从私服获取依赖那么只需要在maven的setting.xml配置文件中配置镜像地址,镜像地址设置public群组,nexus有一个群组属性将多个库聚合到一起,所以直接引用public库即可

<mirror>
<id>public</id>
<name>public repositroy</name>
<url>http://192.168.43.211:8081/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>

id: 起一个标记
name: 介绍
url: 组仓库的地址
mirrorOf: 引组里面哪些仓库,“*”为全部

9.2 将自己的项目上传到私服

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
1. 需要在setting.xml配置文件中添加私服的用户名和密码
<server>
<id>public</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>

2. 在项目的pom.xml中配置将项目上传到Maven私服的哪个仓库中.
<distributionManagement>
<!-- 上传稳定版或者发行版 -->
<repository>
<id>releases</id> <!-- id对应server密码的id -->
<url>http://192.168.43.211:8081/nexus/content/repositories/releases/</url>
</repository>
<!-- 上传开发板,或者不稳定版 -->
<snapshotRepository>
<id>snapshots</id> <!-- id对应server密码的id -->
<url>http://192.168.43.211:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>

9.3 引入其他开发者上传到私服的项目依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1. 在Maven的setting.xml中配置mirror(上面已经介绍)
2. 在Maven的setting.xml中配置profile
<profile>
<id>dev</id>
<repositories>
<repository>
<id>public</id> <!-- 自定义 url为组的地址,也就是public即可,因为组内包含多个仓库 -->
<url>http://192.168.43.211:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>

3. 在maven的setting.xml中配activefile
<activeProfiles>
<!-- 指定profile -->
<activeProfile>dev</activeProfile>
</activeProfiles>
----------------本文结束感谢您的阅读---------------