Maven学习笔记

1.Maven 简介

Maven是Apache软件基金会组织维护的一款自动化构建工具专注服务于Java平台的项目构建和依赖管理 。

2. 构建过程的主要几个环节

①清理 :删除以前的编译结果,为重新编译做好准备。
②编译 :将Java源程序编译为字节码文件。
③测试 :针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告 :在每一次测试后以标准的格式记录和展示测试结果。
⑤打包 :将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
⑥安装 :在 Maven 环境下特指将打包的结果jar包或war包安装到本地仓库中。
⑦部署 :将打包的结果部署到远程仓库或将war包部署到服务器上运行。

3.maven程序安装

  1. maven下载

    • Binary:编译之后的二进制文件
    • Source:表示可以查看源代码的,比Binary大一点
    • tar.gz archive:Linux、macOS系统使用
    • zip archive:windows系统使用
  2. 解压到本地,注意解压的目录下不要有中文

  3. 配置环境变量

    • mac
      打开terminel输入以下命令:vim ~/.bash_profile打开.bash_profile文件,在次文件中添加设置环境变量的命令

      1
      2
      3
      export M2_HOME= ***这里换成自己解压maven的地址***
      //示例:export M2_HOME=/Users/XXX/Maven/apache-maven-3.6.3
      export PATH=$PATH:$M2_HOME/bin

      添加之后保存并推出,执行以下命令使配置生效:source ~/.bash_profile
      mac中解决source ~/.bash_profile关闭终端后在打开不生效的问题,需要在~/.zshrc文件最后,增加一行:source ~/.bash_profile。如果没有此文件可以使用vim ~/.zshr新建一个文件,在添加对应的命令

    • win
      参考WIN10下安装配置mave文章进行配置

4.配置maven本地仓库

4.1 仓库的分类

  1. 本地仓库:为当前本机电脑上的所有Maven工程服务。
  2. 远程仓库
    • 私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
    • 中央仓库:架设在 Internet 上,为全世界所有Maven工程服务。
    • 中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。

4.2 本地仓库的配置

在 conf/setting.xml的文件中更改默认的仓库位置,也就是我们jar包下载后存放的位置

1
2
<!--需要添加的配置-->
<localRepository>/Users/wangyufei/Maven/repository</localRepository>

5.maven的标准目录结构

6.maven的常用命令

6.1 clean命令

清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test

6.2 complie命令

该命令可以对src/main/java目录的下的代码进行编译

6.3 test命令

测试命令,或执行src/test/java/下junit的测试用例

6.4 package命令

mvn package,打包项目

6.5 install命令

mvn install,打包后将其安装在本地仓库

7. maven的生命周期

7.1 Maven 有三套相互独立的生命周期

  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  2. Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
  3. Site Lifecycle 生成项目报告,站点,发布站点。
    它们是相互独立的,你可以仅仅调用
    clean 来清理工作目录,仅仅调用 site 来生 成站点。 当然你也可以
    直接运行 mvn clean install site 运行所有这三套生命周期。

8. maven的概念模型图

8.1 POM

Project Object Model:项目对象模型。将 Java 工程 的相关信息封装为 对象 作为便于操作和管理的 模型 。Maven 工程的核心配置。可以说学习Maven 就是学习 pom.xml 文件中的配置。

8.2 Maven 的坐标

使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。

  1. groupid:公司或组织的域名倒序当前项目名称

  2. artifactId:当前项目的模块名称

  3. version:当前模块的版本

    1
    2
    3
    <groupId>org.example</groupId>
    <artifactId>wugujiawebmaven</artifactId>
    <version>1.0-SNAPSHOT</version>

8.3 如何通过坐标到仓库中查找 jar包

  1. 将 gav 三个向量连起来org.example+wugujiawebmaven+1.0-SNAPSHOT
  2. 以连起来的字符串作为目录结构到仓库中查找org/example/wugujiawebmaven/1.0-SNAPSHOT

※注意:我们自己的Maven工程必须执行安装操作才会进入仓库 。安装的命令是: mvn install

9. idea集成maven插件


配置创建java工程-DarchetypeCatalog=local 是为了防止在无网络的情况下可是使用本地已经下载好的maven的骨架
配置路径如下:

10. 使用骨架创建maven的java工程


11. 不实用骨架创建maven的java工程


12. 使用骨架创建maven的web工程

  1. 创建web工程


  2. 创建好的javaweb工程(图1),所以我们需要手动添加一个java的目录用于编写java代码(图2),还要将java目录添加为Source Root(图3)
    图1
    图2
    图3

13. 创建自定义的JavaWeb工程



创建web工程信息


创建好的javaweb工程目录如图所示

14.idea中执行maven的命令

  1. clean、test、complie、package、install的命令输入方法相同

15. Maven插件

Maven是一个核心引擎,提供了基本的项目处理能力和建设过程的管理,以及一系列的插件是用来执行实际建设任务。maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试。在pom.xml中通过plugin标签引入maven的功能插件。

15.1 JDK编译版本的插件

1
2
3
4
5
6
7
8
9
10
11
12
<!-- jdk版本插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>

15.2 Tomcat7服务端的插件

1
2
3
4
5
6
7
8
9
10
<!-- tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<server>tomcat7</server>
</configuration>
</plugin>

tomcat插件注意问题
Maven的中央仓库中只有Tomcat7.X版本的插件,而之前我们使用的是8.X的版本,如果想使用Tomcat8.X的插件可以去其他第三方仓库进行寻找,或者使用IDEA集成外部Tomcat8极其以上版本,进行项目的发布

16. 依赖范围

  • compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖
    strus-core、spring-beans。打到war包或jar包
  • provided 编译、和测试有效,A在编译和测试时需要B
    servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)
    不会打到war
  • runtime:测试、运行有效
    在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库,需要的会打到war
  • test:只是测试有效,只在单元测试类中用
    例如:junit 不会打到war
  • 按照依赖强度,由强到弱来排序:(理解)
    compile> provided> runtime> test

17. maven倒入jar包冲突解决

  1. 路径最短者优先
  2. 路径相同时先声明者优先。这里声明的先后顺序指的是dependency标签配置的先后顺序。
  3. 使用<exclusions>标签排除
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
<groupId>com.a tguigu.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1 SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons logging</groupId>
<artifactId>commons logging</artifactId>
</exclusion>
</exclusions>
</dependency>

18. 统一管理所依赖的版本

对同一个框架的一组jar包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来

  1. 统一声明版本号

    1
    2
    3
    4
    5
        //其中
    atguigu.spring.version 部分 是自定义标签
    <properties>
    <atguigu.spring.version>4.1.1.RELEASE</atguigu.s pring.version>
    </properties>
  2. 引用前面声明的版本号

    1
    2
    3
    4
    5
    6
    7
    8
        <dependencies>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springcore</artifactId>
    <version>${atguigu.spring. version}</version>
    </dependency>
    ……
    </dependencies>
  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
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    <?xml version="1.0" encoding="UTF-8"?>
    <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.itheima</groupId>
    <artifactId>ssm_parent_331</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
    <module>ssm_dao_331</module>
    <module>ssm_service_331</module>
    <module>ssm_web_331</module>
    <module>ssm_domain_331</module>
    <module>ssm_utils_331</module>
    </modules>
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
    <spring.security.version>5.0.2.RELEASE</spring.security.version>
    </properties>
    <dependencies>
    <!-- spring相关的jar包 -->
    <!-- 容器 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <!-- 事务 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <!-- JDBC -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <!-- 测试 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <!-- springMVC -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
    </dependency>
    <!-- mybatis与Spring整合 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.1</version>
    </dependency>
    <!-- AOP切面 -->
    <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.7</version>
    </dependency>
    <!-- 数据源 -->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.9</version>
    </dependency>
    <!-- 单元测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
    <!-- servletAPI -->
    <!-- JSP应用 -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
    </dependency>
    <!-- servlet应用 -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>
    <!-- 日志记录工具 -->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.9.1</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.9.1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version>2.9.1</version>
    </dependency>
    <!-- mysql -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
    </dependency>
    <!--oracle的jar包-->
    <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.2.0</version>
    </dependency>
    <!-- JSTL -->
    <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    </dependency>
    <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.1</version>
    </dependency>
    <!-- 文件上传 -->
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
    </dependency>
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
    </dependency>
    <dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
    </dependency>
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring.security.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring.security.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${spring.security.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${spring.security.version}</version>
    </dependency>
    </dependencies>
    </project>

19. maven工程的拆分与聚合

19.1 创建父工程(只需要有pom.xnl文件)



父工程中可以将src的文件夹删除掉,只留下pom.xml文件

19.2 子模块的创建



19.3 工程和模块的区别

区别:

  1. 工程不等于完整的项目,模块也不等于一个完整的项目。代码完整,就可以说这是一个完整的项目和此项目和模块没有关系
  2. 工程只能使用自己的内部资源,工程天生时独立的。后天可以和其他工程和模块建立关联关系
  3. 模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用

关系:

  1. 父子工程中,子模块天生集成父工程,可以使用父工程所有的资源
  2. 子模块之间是没有关联的
  3. 子模块之间可以使用denpendency之间来互相引用,建立关联
  4. 平级之间引用叫做依赖,依赖不是先天的,是后天建立的
  5. 父子工程之间不用建立关系,继承关系是先天的,不需要手动建立

19.4 maven父子工程三种启动方式

  1. 可以在父工程中使用 mvn run
  2. 使用web模块中启动时,需要先将其依赖的jar发布到本地仓库或者远程仓库中
  3. 添加本地的tomcat,不在使用maven中自带的tomcat

19.5 搭建maven的私服环境

  1. 下载nexus
    Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。

  2. Centos7上搭建私服

    • 上传到Centos7服务器

    • 使用命令tar -avxf nexus-3.23.0-03-unix.tar.gz解压完成后会出现一下两个文件(一个是nexus服务,一个是私有仓库)

    • 修改默认的端口

    • 启动nexus
      启动 Nexus(默认端口是8081),Nexus 常用的一些命令包括:/nexus-3.23.0-03/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload},下面我们启动Nexus:

      1
      2
      3
      4
      WARNING: ************************************************************
      WARNING: Detected execution as "root" user. This is NOT recommended!
      WARNING: ************************************************************
      Starting nexus

      上面在启动过程中出现警告:“不推荐使用root用户启动”。这个警告不影响Nexus的正常访问和使用。 如果上面的环境变量配置了,试着修改

      1
      /bin/nexus.rc文件中的run_as_user= “root”

      19.6 私服的应用

      19.6.1 账号和密码是固定的 admin/admin123

      19.6.2 登陆私服的配置(server.xml)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <server>
      <id>releases</id>
      <username>admin</username>
      <password>admin123</password>
      </server>
      <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>admin123</password>
      </server>

19.6.3 配置项目pom.xml

配置私服仓库的地址,本公司的自己的jar包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为release则上传到私服的release仓库,如果版本为snapshot则上传到私服的snapshot仓库

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>release</id>
<name>Release Repository</name>
<url>http://ip/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshot</id>
<name>Snapshot Repository</name>
<url>http://ip/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>

注意:pom.xml这里 和 settings.xml 配置 对应!

19.6.4 相关jar包的下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 下载jar包配置 -->
<profile>
<!--profile的id -->
<id>dev</id>
<repositories>
<repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复 -->
<id>nexus</id> <!--仓库地址,即nexus仓库组的地址 -->
<url>http://localhost:8081/nexus/content/groups/public/</url> <!--是否下载releases构件 -->
<releases>
<enabled>true</enabled>
</releases> <!--是否下载snapshots构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
1
2
3
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>

19.6.5 安装第三方jar包到本地仓库和私服

  1. 安装第三方jar包到本地仓库
1
2
3
4
----进入jar包所在目录运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
----打开cmd直接运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\授课资料\资料:maven【高级】\安装第三方jar包\fastjson-1.1.37.jar
  1. 安装第三方jar包到私服
1
2
3
4
5
6
7
8
9
10
--在settings配置文件中添加登录私服第三方登录信息
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
----进入jar包所在目录运行
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
----打开cmd直接运行
mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\授课资料\资料:maven【高级】\安装第三方jar包\fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

20. 配置全局的jdk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--配置全局的jdk为1.8-->
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>