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安装

  1. 下载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

第一次创建项目前的配置:

  1. 指定Maven的安装目录
    Window->Preference->Maven->Installations->add,添加到Maven的安装目录
    在这里插入图片描述
  2. 设置全局行为配置文件路径和本地仓库路径
    在这里插入图片描述
    然后就可以构建项目了:
    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项目处处用到依赖。
现在说明一个概念和一个问题:

  1. 概念scope:指定依赖的范围
    compile(编译范围:默认):在classpath中存在

    对主程序是否有效:有效
    对测试程序是否有效:有效
    是否参与打包:参与

    test(测试范围):单元测试环境需要

    对主程序是否有效:无效
    对测试程序是否有效:有效
    是否参与打包:不参与

    provided(已提供范围):Web工程经常用到,比如Web容器提供的Servlet API

    对主程序是否有效:有效
    对测试程序是否有效:有效
    是否参与打包:不参与

    runtime(运行时范围):编译不需要
    system(系统范围):自定义构件,指定systemPath
    import(导入依赖)
  2. 问题:如果依赖不是从远程公用仓库复制的,而是自己定义的依赖,可能会报错!因为从远程仓库找不到所需要的依赖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 级别来编译

自定义插件

  1. 新建项目:
<groupId>com.learn</groupId>
<artifactId>maven-project</artifactId>
<version>1.0-SNAPSHOT</version>

  1. 修改pom.xml,添加<packaging>maven-plugin</packaging>
  2. 添加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>

  1. 添加代码
    新建类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...

创建多模块项目

参考博客

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐