Maven是一个项目管理的综合工具。使用 Maven 给我们带来的最直接的好处,就是统一管理了jar 包及jar包之间依赖维护,为我们省去了到各个网站去下载所需的jar包。本篇文章主要讲讲如何用Maven去构建项目。
一、命令行构建maven项目
- 打开命令控制台,输入命令mvn archetype:generate
-
选择需要创建的模板,默认7(普通java项目),10(javaweb项目)
-
输入groupId,artifactId,version三要素及package
- 回车确认后,创建完毕
当然也可以一次性命令创建项目
- 创建java项目
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- 创建简单web项目
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
二、Eclipse上构建maven项目
一般较新版本的Eclipse都会带有Maven插件,如何没有可点击Help -> Eclipse Marketplace,搜索maven关键字,安装如下插件
-
Maven环境配置:点击Window -> Preferences->Maven
- New 菜单 Other.. -> Maven -> Maven Project
-
选择Create a simple project及Use default Workspace location
-
添加项目信息,Finish完成。
三、IDEA上构建maven项目
与在eclipse上类似,首先配置好本地的Maven,我这边直接放图了。
四、pom.xml配置文件详解
以下列出了一些比较常用标签及说明
<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">
<!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志 -->
<groupId>com.test</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目-->
<artifactId>testProject</artifactId>
<!-- 项目的版本号 -->
<version>1.0.0-SNAPSHOT</version>
<!-- 打包类型,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->
<packaging>jar</packaging>
<!--项目一些信息,如项目名,描述,项目地址-->
<name>testProject</name>
<description>一个测试项目</description>
<url>http://www.test.com/ </url>
<!--父pom配置,子pom可继承父pom的groupId,version -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<!--设空值将始终从仓库中获取;
查找顺序:relativePath元素中的地址–本地仓库–远程仓库
-->
<relativePath />
</parent>
<!--父pom中,包含的子模块配置-->
<modules><module>子模块</module></modules>
<!--项目开发者列表 -->
<developers>
<!--项目开发者的信息,列举了主要一些标签 -->
<developer>
<!--项目开发者名称-->
<name> xxxxxx</name>
<!--项目开发者email -->
<email> xxxxxx@163.com</email>
<!--项目开发者URL -->
<url ></url>
<!--项目开发者所属机构 -->
<organization> </organization>
</developer>
</developers>
<!--列出项目协议-->
<licenses>
<license>
<!--license名称 -->
<name>MIT</name>
<!--官方的license正文页面的URL -->
<url></url>
<!--关于license的补充信息 -->
<comments> </comments>
</license>
</licenses>
<!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 -->
<properties>
<file.encoding>UTF-8</file.encoding>
<java.version>1.8</java.version>
<commons.io.version>2.5</commons.io.version>
</properties>
<!--dependencyManagement
父pom可以用来统一管理子模块的依赖jar包;
子pom可以用来引入父pom
-->
<dependencyManagement>
<dependencies>
........
<!--子pom通过非继承的方式来引入pom,可以多个;而parent的方式只能一个-->
<dependency>
<groupId>com.test</groupId>
<artifactid>project_parent1</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 定义项目的jar依赖关系 -->
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version></version>
<!--范围选择,默认compile:编译,运行,测试 有效
provided:编译,测试 有效,不含在打包中
test:测试 有效
runtime:运行,测试 有效
system:仓库之外的类库;编译,测试 有效
-->
<scope>compile</scope>
<systemPath>配合 scope=system时使用</systemPath>
<!-- 设置依赖是否可选,默认为false,
如果为true时,其它项目依赖该项目时,需要 quartz时,需写明
dependency依赖-->
<optional>false</optional>
<!-- 排除依赖关系。禁止c3p0导入-->
<exclusions>
<exclusion>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--构建配置-->
<build>
<!-- 产生的构件的文件名,默认值是${project.artifactId}-${project.version}。 -->
<finalName>${project.artifactId}</finalName>
<!-- 构建产生的所有文件存放的目录,默认为${basedir}/target,即项目根目录下的target -->
<directory>${basedir}/target</directory>
<!--插件列表-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>..</version>
<executions>
<!--插件与maven生命周期阶段绑定配置-->
<execution>
<id>att-sources</id>
<!--阶段名,如:compile,package等-->
<phase>package</phase>
<!--插件需要执行的目标-->
<goals>
<goal></goal>
</goals>
</execution>
</executions>
<!--插件参数配置-->
<configuration>
</configuration>
<!--项目引入插件所需要的额外依赖 -->
<dependencies>
<dependency>...</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<!--远程库配置,可能需要引入一些特殊jar-->
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<!--远程库地址-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--开启发布版本的下载-->
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<!-- 插件远程库 -->
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--开启发布版本的下载-->
<releases>
<enabled>true</enabled>
</releases>
<!--关闭快照的下载-->
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
依赖范围
scope | 编译 | 测试 | 运行 |
---|---|---|---|
compile | Y | Y | Y |
test | Y | ||
provided | Y | Y | |
runtime | Y | Y | |
system | Y | Y |
依赖传递性
比如有a,b,c三个jar包或项目,a依赖b,b依赖c,而c对于a来说是传递性依赖。传递依赖受依赖范围限制。下表中第一列代表a对b的依赖,第一行代表b对c的依赖。则a对于c的依赖范围如下表所示,为空则不依赖。
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | runtime | ||
test | test | test | ||
provided | provided | provided | provided | |
runtime | runtime | runtime |
五、Maven打包命令
主要有三个打包命令mvn package、mvn install、mvn deploy。当然一般打包之前都会先清理一下。
- mvn clean package:完成了清理、项目编译、单元测试、打包功能。
- mvn clean install:完成了清理、项目编译、单元测试、打包及布署到本地maven仓库功能。
- mvn clean deploy:完成了清理、项目编译、单元测试、打包及布署到本地maven仓库和远程仓库功能。
参考资料
pom.xml配置文件详解