Maven软件原理

Maven

  • pom.xmlMaven的核心配置文件, pomProject Object Model, 项目对象模型, 将当前项目抽象为文档对象, 再操作整个项目
  • Dependency, 依赖管理模型, 主要负责Maven的依赖管理功能
    • pom.xml中配置了一个坐标, Dependency就会在本地仓库(local)中找到对应的jar
    • 如果local没有, 就会通过其他方式(b2b, central中央仓库)下载
  • Maven本地仓库中一共存在三种jar包, 自己工程安装到本地仓库的jar包, 从网上下载的第三方jar包, 支持Maven工作的过程中需要用到的jar

Maven结构

Maven安装需要有JAVA_HOME环境变量

  • bin: 包含有Maven的运行脚本, 比如mvn.cmd
  • boot: 包含有plexus-classworlds类加载器框架
  • conf: 包含核心配置文件, 主要是settings.xml
  • lib: 包含运行时需要的Java类库

Maven配置

  1. 修改本地仓库位置

    1
    <localRepository>D:\MvnRepo</localRepository>
  2. 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>
  3. maven选用编译项目的jdk版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <profile>
    <id>jdk-17</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>17</jdk>
    </activation>
    <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
    </properties>
    </profile>
  4. IDEA配置本地Maven
    setting
    start
    projectstructure

Maven工程的GAVP

GroupId, ArtifactId, Version, Packaging, 最后一个是可选项, 如果是Java工程默认就是打jar

  1. GroupId: com.{公司/BU}.业务线.[子业务线], 最多四级, com.taobao.tddl, com.alibaba.sourcing.multilang
  2. ArtifactId: 产品线名-模块名, 语义不重复不遗漏, tc-client, uic-api
  3. Version: 主版本号.次版本号.修订号, 不兼容api修改应该更新主版本号, 向下兼容功能新增修改次版本号, 修复bug修改修订号
  4. Packaging: 指示项目打包为什么类型文件, idea根据packing值, 识别maven项目类型
    • jar表示普通Java工程
    • war表示web工程
    • pom表示不会打包, 用来做继承的父工程, 只负责依赖管理和聚合, 所以不用参与打包

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<modelVersion>4.0.0</modelVersion>
<!-- 这里是指POM版本为4.0.0 -->

<groupId>edu.njupt.maven</groupId>
<artifactId>maven_java</artifactId>
<version>1.0</version>
<!-- 这个是Maven工程坐标 -->

<properties>
<!-- 中间放Maven工程属性 -->
</properties>

<dependencies>
<!-- 依赖 -->
</dependencies>

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
├── pom.xml/                            # Maven 项目管理文件
└── src/
├── main/ # 项目主要代码
| ├── java/ # Java源代码目录
| | └── com/example/myapp/
| | ├── controller/
| | ├── service/
| | ├── dao/
| | └── model/
| ├── resources/
| | ├── log4j.properties # 日志配置文件
| | ├── spring-mybatis.xml # Spring Mybatis配置文件
| | └── static/ # 静态资源目录
| | ├── css/
| | ├── js/
| | └── images/
| └── webapp/ # 存放Web相关配置和资源
| ├── WEB-INF/ # 存放Web应用配置文件
| | ├── web.xml # Web应用的部署描述文件
| | ├── lib/ # 第三方jar包
| | └── classes/ # 存放编译后的classes文件
| └── index.html # Web应用入口页面
└── test/ # 项目测试代码, 比如Junit单元测试
├── java/ # 单元测试目录
└── resources/ # 测试资源目录

WEB-INF目录下的资源是受保护的资源, 不可通过浏览器直接访问

Maven命令构建

pom.xml同级目录下运行下面的代码

Maven中测试类的测试方法名需要以testXXX命名, 测试类需要以XXXXTestTestXXXX命名, 否则不会进行测试

如果需要一次性执行多条命令, 可以在mvn后面跟上多条指令, 比如mvn clean test

命令 功能
mvn compile 编译项目, 生成target文件, 只会编译核心代码
mvn test-compile 编译测试代码
mvn test 自动执行测试方法
mvn package 打包项目, 生成jar, war文件, 会执行测试代码, 将核心程序和测试程序都进行编译, 但是打包里面不会包含测试程序
mvn clean 清理编译或打包以后的项目结构
mvn install 打包后上传到Maven本地仓库, 如果一个项目需要自己写的另一个项目的jar, 就需要先安装到本地仓库中
mvn deploy 只打包, 上传到Maven私服仓库
mvn site 生成站点
mvn test 执行测试代码
1
2
3
4
5
6
7
8
9
10
11
12
<!-- war包打包插件和jdk版本不匹配, 打包war会报错 -->
<!-- pom.xml添加如下内容即可 -->
<build>
<!-- jdk17和war包插件不匹配 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>

生命周期

构建的生命周期可以看作是一组固定构建命令的有序集合, 触发周期后的命令会自动触发周期前的命令

  • 构建周期的作用可以简化构建流程
  • 一个周期包含若干命令, 包含若干插件

依赖管理

依赖属性

  • properties中可以指定属性
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <properties>
    <junit.version>5.9.2</junit.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId></groupId>
    <artifactId></artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
    </dependency>
    </dependencies>

依赖范围(scope)

对应jar包的作用范围为: 编译环境, 测试环境, 运行环境

范围 描述
compile 编译依赖范围, 默认值, 对于三种classpath均有效, Maven在上述三种classpath中均会被引入, 比如log4j在编译, 测试, 运行过程中都是必须的
test 测试依赖范围, 只对测试classpath有效, 比如junit
provided 已提供依赖范围, 只对编译和测试classpath有效, 比如servlet-api在运行阶段由于外部环境已经提供了, 所以不需要
runtime 运行时依赖范围, 只对测试, 运行classpath有效, 比如JDBC驱动实现依赖, 在编译时只需要JDK提供的JDBC接口即可, 只有测试和运行阶段才需要实现了JDBC接口的驱动
system 系统依赖范围, 与provided一致, 用于添加非Maven仓库的本地依赖, 通过依赖元素dependency中的systemPath元素指定本地依赖的路径, 使用会导致项目的可移植性降低, 所以一般不使用
import 导入依赖范围, 只能与dependencyManagement元素配合使用, 将目标pom.xml中的dependencyManagement的配置导入合并到当前的pom.xmldependencyManagement