JavaWeb系列6: Maven
本文是作者的读博客笔记和心得整理,也引用了一些比较好的博客文章,部分内容来源于网络,如有侵权,请联系作者。
Maven
在maven出来之前,都是用Ant作为一个构建工具,并未对项目中低端工程依赖和项目本身进行管理.
核心是:依赖管理, 项目信息管理, 中央仓库, 约定大于配置的核心功能使得Maven成为当前Java项目构建和管理工具的标准选择。
常用maven命令
mvn clean:运行清理操作
mvn clean compile: 表示运行清理之后进行编译
mvn clean test: 运行清理和测试
mvn clean package: 清理和打包
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)
Maven使用格式
一个配置的示例:
<?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.tengj</groupId>
<artifactId>springBootDemo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springBootDemo1</name>
</project>
第一行是XML头,指定版本号
project指定根元素
modelVersion指定当前POM模型的版本号
groupId,artifactId和version指定了一个项目的基本坐标.
groupId指定的是组,artifactId指定的是组中id,version指定版本号
接下来是依赖范围:
示例:
<project>
...
<dependencies>
<dependency>
<groupId>实际项目</groupId>
<artifactId>模块</artifactId>
<version>版本</version>
<type>依赖类型</type>
<scope>依赖范围</scope>
<optional>依赖是否可选</optional>
<!—主要用于排除传递性依赖-->
<exclusions>
<exclusion>
<groupId>…</groupId>
<artifactId>…</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependencies>
...
</project>
type:大部分时候为jar
scope:依赖的范围
optional:标记依赖是否可选
exclusions:用来排除传递性依赖
依赖范围
compile:默认范围,对于编译测试运行3种classpath全部有效
test:只在测试classpath有效,JUnit
provided:对于编译和测试有效,运行无效.
runtime:只在测试和运行有效,JDBC
和Gradle的比较
使用Groovy来声明项目设置,抛弃了基于XML的各种繁琐配置.
比如一个典型的Gradle项目:
dependencies {
// This dependency is exported to consumers, that is to say found on their compile classpath.
api 'org.apache.commons:commons-math3:3.6.1'
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation 'com.google.guava:guava:23.0'
// Use JUnit test framework
testImplementation 'junit:junit:4.12'
compile 'org.hibernate:hibernate-core:3.6.7.Final'
testCompile ‘junit:junit:4.+'
}
Gradle的优点是可以动态的实现版本管理,而且先天可以解决依赖冲突的问题.
多模块构建
一般一个项目分解为多个模块,需要定义一个parent POM来作为一组module的通用配置模型. 也可以用标签来定义一组子模块,
parent的配置会自动继承给子module.
Gradle也支持多模块构建,在parent的build.gradle中可以使用allproject和subproject来分别定义应用于所有项目/子项目,
子模块的定义放置在settings.gradle中,每一个模块代表一个project的对象实例.
执行gradle -q nice会依次打印出各模块的项目名称.