Maven自学教程
Java开发为什么要用Maven模块化开发:在不同的IDE工具情况可能不同!IDEA拥有module模块化功能,而像eclipse系列工具没有,一旦多人开发庞大项目,并不能方便的进行模块化拆分!借助于Maven就可以将一个项目拆分成多个工程。导入jar包更加方便:过去项目都是下载jar包,然后手动导入借助于Maven就可以将需要的jar包按配置自动下载到本地仓库并导入到项目中。解决部分jar包依赖
Java开发为什么要用Maven
模块化开发:
在不同的IDE工具情况可能不同!IDEA拥有module模块化功能,而像eclipse系列工具没有,一旦多人开发庞大项目,并不能方便的进行模块化拆分!
借助于Maven就可以将一个项目拆分成多个工程。
导入jar包更加方便:
过去项目都是下载jar包,然后手动导入
借助于Maven就可以将需要的jar包按配置自动下载到本地仓库并导入到项目中。
解决部分jar包依赖问题:
过去需要添加的jar包以来其他的jar包,查找很不方便
借助于Maven就可以自动解决依赖问题。
Maven介绍
Maven是一个项目管理工具,类似于前端使用的脚手架vue-cli概念
Maven核心概念包含:
POM(项目对象模型)、一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
名词解释:
Project:被build的模块,都是工程,即POM(工程对象模型)。一个工程可以依赖其他工程,也可以是有其他子工程。
pom:pom.xml是Maven的核心文件(类似于Ant的build.xml)
GroupId:组包名
ArtifactId:项目名
Maven版本
Maven2对Maven1进行重写,提供了更加强大的Java构建和API项目,允许Maven被植入任何地方,尤其高级别产品IDEs、质量工具、报告工具等——构建生命周期概念正式化,更易扩展。
Maven3在Maven2的基础上提升性能,自动指定父版本,并行生成,更好的完整性报告…
目前最新版本:3.6.3
Maven安装
- 下载Maven安装包,解压
修改Maven全局行为配置文件setting.xml:
1.1 自定义Maven的本地库(localRepository)路径:(默认位置已被注释)
1.2 自定义Maven的镜像库(mirrors):(本人使用的是国内阿里云的镜像库)
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
1.3 profiles:个性化配置,但需要在activation标签中激活
对于个性化配置,最好设置创建使用JDK版本(默认JDK1.5版本太低):
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
其他的可设置可不设:
offline:是否每次编译都去查远程中心库(默认不配置false)
pluginGroups:插件组
proxies:通过代理访问外部库
servers:集成认证服务
activeProfiles:激活的profile
2. Windows系统安装:
2.1 首先确认JDK是否已安装过
2.2 配置Maven环境变量:
M2_HOME(推荐!兼容Maven2版本)或MAVEN_HOME(只兼容Maven3)
path
2.3 mvn -v查看安装成功否
至此,Maven安装和配置都完成了!
Maven仓库
远程公用仓库
经常被使用的Maven自身维护的远程仓库:强烈推荐网址
内部中心仓库(私有共享仓库)
一般有所在公司自己设立的,方便公司内部使用。
本地仓库(localRepository)
这个在setting.xml已配置过,就是本地的项目共享库。
Maven命令
命令行方式相对于IDE工具似乎不常用了!只做了解:
查看版信息:mvn -v
获取帮助:mvn -h
查看错误信息:mvn -e
手动构建Maven项目(按提示操作):mvn archetype:generate
转化为eclipse项目:mvn eclipse:eclipse
转化为IDEA项目:mvn idea:idea
编译:mvn compile
测试代码:mvn test
清除编译结果:mvn clean
打包:mvn package
发布:mvn install 或 deploy
核心配置文件pom.xml
位于每个工程的根目录,是指示Maven工作的元数据文件。
<project> :文件的根节点.
<modelversion> :pom.xml 使用的对象模型版本.
<groupId> :创建项目的组织或团体唯一 Id.
<artifactId> :项目的唯一 Id, 可视为项目名 .
<packaging> :打包类型,一般有 JAR,WAR,EAR等
<version> :产品的版本号 .
<name> :项目的显示名,常用于 Maven生成的文档。
<url> :组织的站点,常用于 Maven 生成的文档。
<description> :项目描述,常用于 Maven生成的文档.
<dependencies> :构件依赖 :构件依赖
<parent>:模型继承
<dependencyManagement>:依赖管理
<reporting> :创建报告
<build> :构建
<repositories> :引用第三方仓库
<licenses> :许可
myeclipse和IDEA构建Maven项目
myeclipse
第一次创建项目前的配置:
- 指定Maven的安装目录
Window->Preference->Maven->Installations->add,添加到Maven的安装目录
- 设置全局行为配置文件路径和本地仓库路径
然后就可以构建项目了:
file->new->other->Maven->Maven Project
2.1 上一步勾选,则如图
2.2 上一步不勾选,则如图:
两种方式创建的项目目录比对:
核心概念介绍
POM
类似于DOM,都是抽象化的概念。包含工程的所有部分,项目构建信息…构建配置…构建依赖关系…等等
坐标
用于精确定位唯一的一个Maven工程,包含五个部分:
groupId、artifactId、version、package(打包类型)、classifiter(分类:二进制、源、文档…)
比如:pom.xml中导入的依赖
定位到本地仓库路径就是:
只是将.换成了/
依赖仲裁
最短路径原则
A->B->C->common1.1.jar
A->common1.0.jar
那么A最终会依赖common1.0.jar
加载先后原则
A->B
A->C
B->common1.0.jar
C->common1.1.jar
A同时依赖B和C,那么B和C谁先加载,就依赖谁的common.jar
依赖
<!--详细的依赖配置-->
<dependency>
<groupId>……</groupId>
<artifactId>……</artifactId>
<version>……</version>
<classifier>……</classifier>
<scope>……</scope><!--依赖范围-->
<type>……</type><!--依赖类型-->
<systemPath>……</systemPath>
<optional>……</optional><!--标记依赖是否可选,如A->B->C,A依赖于C,A就可以设置为可选-->
<exclusions></exclusions><!--排除传递依赖-->
</dependency>
这个概念很清晰!Maven项目处处用到依赖。
现在说明一个概念和一个问题:
- 概念scope:指定依赖的范围
compile(编译范围:默认):在classpath中存在
(
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:参与
)
test(测试范围):单元测试环境需要
(
对主程序是否有效:无效
对测试程序是否有效:有效
是否参与打包:不参与
)
provided(已提供范围):Web工程经常用到,比如Web容器提供的Servlet API
(
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
)
runtime(运行时范围):编译不需要
system(系统范围):自定义构件,指定systemPath
import(导入依赖) - 问题:如果依赖不是从远程公用仓库复制的,而是自己定义的依赖,可能会报错!因为从远程仓库找不到所需要的依赖jar包,本地仓库也没有。
比如:将自己的Java项目mvn package打包成jar包,放到本地仓库,还会报错吗?答案是还会报错!因为本地仓库jar所在的目录还需要其他的配置文件,从远程公用仓库下载会自动生成,但是自定义的jar包少了一些Maven所需要的配置文件,可以执行mvn install发布到本地即可!
仓库
仓库上面已经说过…
生命周期/插件/目标
Maven有三套生命周期:Clean lifecycle(构建工程之前清理相关)、Default lifecycle(构建核心部分:编译、测试、打包、安装、部署…)、site lifecycle(生成项目报告、站点、发布站点)
clean生命周期
pre-clean :执行清理前的工作;
clean :清理上一次构建生成的所有文件(target);
post-clean :执行清理后的工作
default生命周期
default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。
process-resources :复制和处理资源文件到target目录,准备打包;
compile :编译项目的源代码;
test-compile :编译测试源代码;
test :运行测试代码;
package :打包成jar或者war或者其他格式的分发包;
install :将打好的包安装到本地仓库,供其他项目使用;
deploy :将打好的包安装到远程仓库,供其他项目使用;
site生命周期
pre-site
site :生成项目的站点文档;
post-site
site-deploy :发布生成的站点文档
<!--构建配置-->
<build>
<finalName>最终名 </ finalName>
<plugins >
<plugin>
<! -- Maven MavenMaven一切的构建工作都是居于插件执行,常用默认有:编译、打包安装 -- >
</plugin>
</plugins >
</build>
PS:一般构建时加上必要的插件就可以,不需更多配置。因为它有内部约定。如果需要改变配置,例如源代码文件夹、编译打包结果文件夹等等,都是可以改变的。
比如自定义编译插件:
<plugin >
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</<source>
<target>1.6</<target>
<encoding>UTF-8</encoding>
</configuration>
</plugin >
对应命令:
mvn compile
PS: 该插件是默认, 如果没有配置,Maven将以 1.3 级别来编译
自定义插件
- 新建项目:
<groupId>com.learn</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
- 修改pom.xml,添加
<packaging>maven-plugin</packaging>
- 添加dependency
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope>
</dependency>
- 添加代码
新建类MyMojo
@Mojo(name="learn",defaultPhase = LifecyclePhase.PACKAGE)
public class MyMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println("start plugin...");
}
}
这里挂载的phase是package
执行mvn clean install
5. 其他项目中使用
<plugin>
<groupId>com.learn</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
执行mvn project:learn
执行日志如下:
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-cloud-config-client 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-project:1.0-SNAPSHOT:learn (default-cli) @ spring-cloud-config-client ---
start plugin...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
但是如果我们直接执行mvn install时是看不到这条打印的,说明没有生效。
需要添加executions
<plugin>
<groupId>com.learn</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>learn</goal>
</goals>
</execution>
</executions>
</plugin>
然后再执行mvn install
,可以看到:
[INFO] --- maven-project:1.0-SNAPSHOT:learn (default) @ spring-cloud-config-client ---
start plugin...
创建多模块项目
更多推荐
所有评论(0)