Maven 是什么?
Maven 主要服务于基于 Java 平台的项目构建、依赖管理和项目信息管理。
Maven 的主要功能
主要分为 5 点:
依赖管理系统
多模块构建
一致的项目结构
一致的构建模型和插件机制
你们项目为什么选用 Maven 进行构建?
首先,Maven 是一个优秀的项目构建工具。使用maven,可以很方便的对项目进行分模块构建,这样在开发和测试打包部署时,效率会提高很多。
其次,Maven 可以进行依赖的管理。使用 Maven ,可以将不同系统的依赖进行统一管理,并且可以进行依赖之间的传递和继承。
Maven 规约是什么?
/src/main/java/ :Java 源码。
/src/main/resource :Java 配置文件,资源文件。
/src/test/java/ :Java 测试代码。
/src/test/resource :Java 测试配置文件,资源文件。
/target :文件编译过程中生成的 .class 文件、jar、war 等等。
pom.xml :配置文件
Maven 要负责项目的自动化构建,以编译为例,Maven 要想自动进行编译,那么它必须知道 Java 的源文件保存在哪里,这样约定之后,不用我们手动指定位置,Maven 能知道位置,从而帮我们完成自动编译。
遵循**“约定>>>配置>>>编码”**。即能进行配置的不要去编码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。
Maven 常用命令
mvn archetype:create :创建 Maven 项目。
mvn compile :编译源代码。
mvn deploy :发布项目。
mvn test-compile :编译测试源代码。
mvn test :运行应用程序中的单元测试。
mvn site :生成项目相关信息的网站。
mvn clean :清除项目目录中的生成结果。
mvn package :根据项目生成的 jar/war 等。
mvn install :在本地 Repository 中安装 jar 。
mvn eclipse:eclipse :生成 Eclipse 项目文件。
mvn jetty:run 启动 Jetty 服务。
mvn tomcat:run :启动 Tomcat 服务。
mvn clean package -Dmaven.test.skip=true :清除以前的包后重新打包,跳过测试类。
用到最多的命令
mvn eclipse:clean :清除 Project 中以前的编译的东西,重新再来。
mvn eclipse:eclipse :开始编译 Maven 的 Project 。
mvn clean package :清除以前的包后重新打包。
Maven 有哪些优点和缺点
? 1)
优点
简化了项目依赖管理。
当年,多少人被 SSH 整合搞死搞活,很多时候,是因为依赖不完整,或者版本不正确。自从 Maven 出来后,终于可以无痛了~当然,也有一部分功劳是 Spring Boot ,这是后话。
易于上手,对于新手可能一个 mvn clean package 命令就可能满足我们的工作。
便于与持续集成工具(Jenkins)整合。
便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
Maven 有很多插件,便于功能扩展,比如生产站点,自动发布版本等。
? 2)
缺点
Maven 是一个庞大的构建系统,学习难度大。
这里的学习,更多指的完整学习。如果基本使用,并不会存在该问题。
Maven 采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
当依赖很多时,m2eclipse 老是搞得 Eclipse 很卡。
使用 IDEA ,而不是 Eclipse ,完美解决。
中国的网络环境差,很多 repository 无法访问,比如 Google Code、 JBoss 仓库无法访问等。
这个也好解决,在 中增加阿里巴巴的 Maven 私服,具体可以参见 《提高 Maven 速度 —— Maven 仓库修改成国内阿里巴巴地址》 文章。
Maven的jar冲突处理
假设要用到Spring-core的jar包,出现jar包冲突(可能出现5.1和4.7)
存在如下依赖
- A->B->C->5.1
- D->E->F->G->4.7
Caused by:java.lang.NoSuchMethodError
Caused by: java.lang.ClassNotFoundException
查看依赖冲突: mvn dependency:tree
1.默认解决方案
- 最短依赖路径优先,选5.1
- 如果1不成立(2个路径长度相同),则最早声明优先
2.移除依赖:用于排除某项依赖的依赖jar包
- 我们可以借助Maven Helper插件中的Dependency Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去。
- 在pom.xml文件中写<excluede>排除
3.版本锁定原则:一般用在继承项目的父项目中
<properties>
<spring.version>spring4.2.4</spring.version>
<properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.versio}</version>
</dependency>
</dependencies>
</dependencyManagement>