Maven
一、是什么(What)
1. maven是一个自动化构建工具,把java web工程,编译后部署到服务器上
2. 构建的环节:清理clean->编译comple->测试test->打包package->安装install->部署deploy
二、为什么使用Maven(Why)
1. 项目太大,不好拆分
2. 依赖的jar包需要复制粘贴到项目的lib中,需要手动下载和操作
3. jar包版本可能不一致
4. 依赖jar包的依赖,也要手动添加
三、Maven的作用
1. 项目构建,即自动化地进行编译、测试、部署等操作
2. 依赖管理,自动获取并管理依赖的类库或者框架
四、Maven仓库
1. 中央仓库, 提供公共的镜像地址,所有的组件都发布到上面去,这样构成了一个完整的生态环境,文件管理按坐标中“.”的目录层级
2. 私服,比如Sonatype Nexus,私服地址在settings.xml中的profile中配置,同时可能需要配置servers标签,用于用户名和密码
http://www.blogjava.net/xiaomage234/archive/2014/05/13/413584.html
3. 本地仓库,按目录级别存储,一般都在用户目录.m2下(即maven安装目录下conf/settings.xml的localRepositoty标签配置)
五、安装
1. 安装JDK,配置JAVA_HOME的环境变量
2. 下载解压maven,放在非中文无空格的路径下
3. 配置maven的环境变量
a. windows系统:增加环境变量M2_HOME,路径是maven解压后的根目录,在环境变量path中,增加%M2_HOME%\bin
b. MAC系统:https://blog.csdn.net/anialy/article/details/22217937
4. mvn -version查看maven版本
六、生命周期
1. Clean Lifecycle 清理工作
2. Default Lifecycle 核心部分
a. clean, 清除target
b. validate, 验证工程是否正确
c. compile,编译代码,生成class
d. test, 可选,测试,测试代码不会被打包或者部署
e. package,生成jar,即一个zip压缩文件
f. verify
g. install,拷贝到本地仓库
h. site
i. deploy,上传到远程仓库
3. Site Lifecycle 生成项目报告,发布站点
七、Maven依赖规则
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency>
1. 坐标,用于识别一个依赖,可以映射到仓库路径
<groupId>org.apache</groupId> // 通常为组织的定义,建议公司域名反过来,如org.apache<artifactId>commons-lang</artifactId> // 项目或工程的名称<version>1.4.1</version> // 版本号,1.0 或1.0-SNAPSHOT,稳定版或快照版<package>jar</package> // 默认是jar,也可以是ear/war/pom/apk,实质都是zip包<scope>compile</scope> // 默认compile,可以是compile/runtime/test/provided3. 依赖
a. 在pom.xml文件里,一般先引用父pom,把重复依赖都放父pom里
<parent> <groupId>com.demo</groupId> <artifactId>parent-pom</artifactId> <version>1.0</version> </parent>dependencies 提供版本号的统一管理。这样可以避免在多个地方重复声明相同的版本号,便于版本升级和维护c. 依赖冲突
用exclusion排除冲突版本
a. 路径最短优先原则: A -> B -> E -> C(1.0),A -> D -> C (2.0),后面的路径较短,选后面那个
b. 声明优先原则: 依赖路径相同时,比如A -> B -> C(1.0),A -> D -> C (2.0),这时路径是相同的,如果pom中B在D前面,就选B依赖的C(1.0)
3. 统一管理依赖的版本号
properties标签
4. 依赖环
A->B->C->A, 但最后一个A不是最新的
八、常用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"> <!-- 指定POM模型的版本 --> <modelVersion>4.0.0</modelVersion> <!-- 项目坐标信息 --> <groupId>com.example</groupId> <!-- 定义项目所属的组 --> <artifactId>my-project</artifactId> <!-- 定义项目的唯一标识符 --> <version>1.0-SNAPSHOT</version> <!-- 定义项目的版本号 --> <packaging>jar</packaging> <!-- 定义项目的打包方式 --> <!-- 父项目信息 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.15.RELEASE</version> </parent> <!-- 模块信息 --> <modules> <module>module1</module> <!-- 子模块名称 --> <module>module2</module> </modules> <!-- 项目描述信息 --> <name>My Project</name> <url>http://example.com/my-project</url> <description>这是一个示例项目</description> <!-- 自定义属性 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version> <java.version>1.8</java.version> </properties> <!-- 项目依赖 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- 构建配置 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> <!-- 依赖管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 配置多环境 --> <profiles> <!-- 开发环境 --> <profile> <id>dev</id> <properties> <env>dev</env> <database.url>jdbc:mysql://localhost:3306/dev_db</database.url> <database.username>dev_user</database.username> <database.password>dev_password</database.password> </properties> <activation> <activeByDefault>true</activeByDefault> <!-- 默认激活 --> </activation> </profile> <!-- 测试环境 --> <profile> <id>test</id> <properties> <env>test</env> <database.url>jdbc:mysql://localhost:3306/test_db</database.url> <database.username>test_user</database.username> <database.password>test_password</database.password> </properties> </profile> <!-- 生产环境 --> <profile> <id>prod</id> <properties> <env>prod</env> <database.url>jdbc:mysql://prod-server:3306/prod_db</database.url> <database.username>prod_user</database.username> <database.password>prod_password</database.password> </properties> </profile> </profiles> </project>
九、常用命令
mvn clean deploy -Dmaven.test.skip 忽略测试代码
mvn clean deploy -Dmaven.test.skip -P dev 指定环境
浙公网安备 33010602011771号