Maven重点知识总结

Maven总结

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

Maven 功能

Maven 能够帮助开发者完成以下工作:

  • 构建
  • 文档生成
  • 报告
  • 依赖
  • SCMs
  • 发布
  • 分发
  • 邮件列表

约定配置

Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。如下所示:

目录目的
${basedir}存放pom.xml和所有的子目录
${basedir}/src/main/java项目的java源代码
${basedir}/src/main/resources项目的资源,比如说property文件,springmvc.xml
${basedir}/src/test/java项目的测试类,比如说Junit代码
${basedir}/src/test/resources测试用的资源
${basedir}/src/main/webapp/WEB-INFweb应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
${basedir}/target打包输出目录
${basedir}/target/classes编译输出目录
${basedir}/target/test-classes测试编译输出目录
Test.javaMaven只会自动运行符合该命名规则的测试类
~/.m2/repositoryMaven默认的本地仓库目录位置

Maven配置文件

settings.xml的作用

它是用来设置Maven参数的配置文件。并且,settings.xml是Maven的全局配置文件。settings.xml中包含类似本地仓库、远程仓库和联网使用的代理信息等配置。

  1. LocalRepository
    作用:该值表示构建系统本地仓库的路径。

  2. Servers
    作用:一般,仓库的下载和部署是在pom.xml文件中的 repositories 和 distributionManagement 元素中定义的。然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在 settings.xml 中。

  3. Mirrors
    作用:用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一个repositoryId。

  4. Profiles
    作用:根据环境参数来调整构建配置的列表。
    settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。它包含了id、activation、repositories、pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为这里只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile。当所有的约束条件都满足的时候就会激活这个profile。

Maven配置及集成IDE

Maven仓库配置:

在settings.xml 文件的设置:D:\tools\apache-maven-3.3.9\conf 目录下settings.xml配置maven本地仓库地址,
D:\software\Repository,这里的路径对应自己本地的仓库路径,并设置私服仓库路径地址或国内镜像。

<localRepository>/path/to/local/repo</localRepository>
.
.
.
<mirrors>
	<mirror>
	    <id>nexus-aliyun</id>
	    <mirrorOf>*</mirrorOf>
	    <name>Nexus aliyun</name>
	    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
	</mirror>
</mirrors>

IDEA中设置

在这里插入图片描述

Maven POM

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

POM 中可以指定以下配置:
• 项目依赖
• 插件
• 执行目标
• 项目构建 profile
• 项目版本
• 项目开发者列表
• 相关邮件列表信息

POM 重要标签说明:

    <!-- 模型版本 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
    <groupId>com.companyname.project-group</groupId>
 
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>project</artifactId>
 
    <!-- 版本号 -->
<version>1.0</version>
<!--构建项目需要的信息 -->
    <build>
	<!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置 -->
        <pluginManagement>
            <!--使用的插件列表 。 -->
            <plugins>
                <!--plugin元素包含描述插件所需要的信息。 -->
                <plugin>
                    <!--插件在仓库里的group ID -->
                    <groupId />
                    <!--插件在仓库里的artifact ID -->
                    <artifactId />
                    <!--被使用的插件的版本(或版本范围) -->
                    <version />
				</plugin>
            </plugins>
        </pluginManagement>
	</build>
<!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 -->
    <dependencies>
        <dependency>
            <!--依赖的group ID -->
            <groupId>org.apache.maven</groupId>
            <!--依赖的artifact ID -->
            <artifactId>maven-artifact</artifactId>
            <!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 -->
            <version>3.8.1</version>
            <!-- 依赖类型,默认类型是jar。 -->
            <type>jar</type>
            <!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成 
                JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。 -->
            <classifier></classifier>
            <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 - compile :默认范围,用于编译 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath 
                - runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得 
                - systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
            <scope>test</scope>
            <!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。 -->
            <systemPath></systemPath>
            <optional>true</optional>
        </dependency>
    </dependencies>

依赖管理

为了给项目添加一个依赖项,必须将此依赖项添加到pom.xml文件中。下次运行Maven的时候,它将从Ibiblio存储库中得到这个依赖项,并且将此依赖项添加到项目构建路径中。Maven中最大的麻烦之处就是不能从Maven存储库中获取Sun的jar文件。这个问题归因于Sun在其代码中设置的许可证限制。解决这个问题的办法有两种,一种是下载这些代码并将它们安装在您本地的存储库中,另一种是做一个外部声明,并将这个声明指向文件系统中依赖项所在的位置。改变Maven的存储库路径只需简单地编辑其安装目录下 conf文件夹下面的settings.xml文件即可

在Maven中使用依赖是简单的。让我们看看往上述pom.xml文件中添加一个依赖项的情况。

<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.1</version>
<scope>compile</scope>
</dependency>

注意到scope参数的使用,它告诉了Maven依赖项在何种阶段是所需的。在使用JUnit的情况下,我们设置scope参数的值为test来告诉Maven这个依赖项只是在测试阶段所需的,而不是运行时所需的资源。以下是scope参数值的说明:
–compile:默认值。表明是所有任务所需的资源
–test:运行所有的测试用例时所需资源
–runtime:表明是运行时所需资源
–provided:JDK部分或应用服务器的classpath所需的资源

传递性依赖

一种相当常见的情况,比如说 A 依赖于其他库 B。如果,另外一个项目 C 想要使用 A ,那么 C 项目也需要使用库 B。

Maven 可以避免去搜索所有所需库的需求。Maven 通过读取项目文件(pom.xml),找出它们项目之间的依赖关系。

我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。

依赖范围

传递依赖发现可以通过使用如下的依赖范围来得到限制:

范围描述
编译阶段该范围表明相关依赖是只在项目的类路径下有效。默认取值。
供应阶段该范围表明相关依赖是由运行时的 JDK 或者 网络服务器提供的。
运行阶段该范围表明相关依赖在编译阶段不是必须的,但是在执行阶段是必须的。
测试阶段该范围表明相关依赖只在测试编译阶段和执行阶段。
系统阶段该范围表明你需要提供一个系统路径。
导入阶段该范围只在依赖是一个 pom 里定义的依赖时使用。同时,当前项目的POM 文件的 部分定义的依赖关系可以取代某特定的 POM。

Maven 生命周期

maven的生命周期执行是按照顺序来的,而且一般分为三个相互独立的部分:

  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

  2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

  • **验证(validate)?*验证项目是否正确且所有必须信息是可用的
  • **编译(compile)?*源代码编译在此阶段完成
  • **测试(Test)?*使用适当的单元测试框架(例如JUnit)运行测试。
  • **包装(package)?*创建JAR/WAR包如在 pom.xml 中定义提及的包
  • **检查(verify)?*对集成测试的结果进行检查,以保证质量达标
  • **安装(install)?*安装打包的项目到本地仓库,以供其他项目使用
  • **部署(deploy)?*拷贝最终的工程包到远程仓库中,以共享给其他开发人员 和工程
  1. Site Lifecycle 生成项目报告,站点,发布站点。

所以一般而言,一个新的包诞生一般使用clean install deploy即可。

Maven常用命令

Maven2的运行命令是mvn,使用mvn -h可以获得相关的帮助信息。

  • 创建maven项目骨架:
    mvn archetype:generate -DgroupId=otowa.user.dao -DartifactId=user-dao -Dversion=0.01-SNAPSHOT

  • 编译源代码:mvn compile

  • 编译测试代码:mvn test-compile

  • 运行测试:mvn test

  • 产生site:mvn site

  • 打包:mvn package

  • 在本地Repository中安装jar:mvn install
    例:installing D:\xxx\xx.jar to D:\xx\xxxx

  • 清除产生的项目:mvn clean

  • 生成idea项目:mvn idea:idea

  • 编译测试的内容:mvn test-compile

  • 查看当前项目已被解析的依赖:mvn dependency:list

  • 上传到私服:mvn deploy

  • 源码打包:mvn source:jarmvn source:jar-no-fork

Maven插件

Maven的生命周期与插件相互绑定,用以完成实际的构建任务。

常用插件列表
在这里插入图片描述

Reference

  • Maven实战
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值