Maven非常有帮助的内容

  • Post author:
  • Post category:其他




//1.Maven介绍



简介

  • 一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些 Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
  • 可从本地仓库或远程仓库(默认为MvnRepository)中自动导入jar包。
  • 统一jar包资源路径,版本管理,统一项目结构,第三方良好的集成。
  • 通过联网在远程仓库下载的jar包,会存储至本地仓库(C:\Users\用户名.m2)。
  • 是一种XML标记语言。



安装

  • 可以使用指定的Maven版本,或使用 IDEA 自带的Maven(版本3.3.9)。
  • 使用指定的Maven版本:需配置环境变量,第一个变量的变量名为 M2_HOME 或 MAVEN_HOME,值为maven的路径。第二个变量的变量名为 Path,值为%MAVEN_HOME%\bin。
  • 使用 IDEA 自带的Maven版本:无需配置。



目录结构

  • 若要使用Maven,那么项目的目录结构必须符合Maven的规范。
  • project:存放 pom.xml(Maven项目的配置文件) 和所有的子目录。
  • project/src/main/java:存放项目的 java 源代码。
  • project/src/main/resources:存放项目资源文件(如property)。
  • project/src/main/webapp:web 项目的根目录。
  • project/src/test/java:存放单元测试源代码(如JUnit)。
  • project/src/test/resources:存放单元测试资源文件。
  • project/target:存放打包(编译)后的项目文件。



生命周期 (Lifecycle)

  • 清空:clean
  • 验证:validate
  • 编译:compile
  • 测试:test
  • 打包:package
  • 核实:verify
  • 安装,重新下载jar包:install
  • 站点,显示jar包来源:site
  • 部署:deploy



//1.仓库



作用

  • 用来存放Maven管理的所有Jar包。
  • 当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。



分类

  • 本地仓库:本地的Jar包仓库。
  • 中央仓库:官方提供的远程仓库(默认为MvnRepository)。



//2.坐标



作用

  • 是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
  • 添加时,添加至 pom.xml 的

    <dependencies></dependencies>



格式

<dependency>
   <groupId>所需Jar包的项目名</groupId>
   <artifactId>所需Jar包的模块名</artifactId>
   <packaging>jar</packaging>
   <version>所需Jar包的版本号</version>
   <scope>test(依赖范围,后面会讲)</scope>
</dependency>



//3.依赖



简介

  • 传递依赖:如果引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和简洁引用(传递引用)的Jar包都下载到本地。
  • 排除依赖:如果只想下载直接引用的Jar包,那么需要在pom.xml中进行配置。



配置排除依赖

<exclusions>
   <exclusion>
      <groupId>需排除Jar包的项目名</groupId>
      <artifactId>需排除Jar包的模块名</artifactId>
      <packaging>pom</packaging>
      <version>需排除jar包的版本号</version>
   </exclusion>
</exclusions>



依赖范围

  • 在项目发布过程中,帮助决定哪些构件被包括进来。
作用
compile 默认范围,用于编译
provided 类似于编译,但支持你期待jdk或者容器提供,类似于classpath
runtime 在执行时需要使用
test 用于test任务时使用
system 需要外在提供相应的元素。通过systemPath来取得
systemPath 仅用于范围为system。提供相应的路径
optional 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用



依赖冲突

  • 若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
  • 短路优先:本项目—>A.jar—>B.jar—>X1.1.jar、本项目—>C.jar—>1.0.jar。若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X1.1.jar,并且C.jar也引用了X1.0.jar。在此时,Maven只会引用引用路径最短的X1.0Jar。
  • 声明优先:若引用长度相同时,在pom.xml中谁先被声明,就使用谁。



//4.聚合



作用

  • 将多个项目同时运行就称为聚合。



实现聚合

  • 在pom中进行配置:
<modules>
    <module>web-connection-pool</module>
    <module>web-java-crawler</module>
</modules>



//5.继承



作用

  • 在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
  • 可以通过标签来整合子模块的编译顺序。
  • 可以将一些子项目中共用的依赖或将其版本统一写到父级配置中,以便统一管理。
  • groupId,artifactId,version 可直接继承,减少子项目的 pom 配置。



父pom配置

  • 父级的pom文件只作项目的子模块的整合,在maven install 时不会生成 jar/war 压缩包。
  • 将父级项目的pom.xml文件的packaging配置设为pom。
  • 将需要继承的Jar包的坐标放入标签即可。
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>需继承的Jar包的项目名</groupId>
            <artifactId>需继承的Jar包的模块名</artifactId>
            <packaging>pom</packaging>
            <version>需继承的jar包的版本号</version>
        </dependency> 
    </dependencies>
</dependencyManagement>



子pom配置

<parent>
      <groupId>父pom所在项目的groupId</groupId>
      <artifactId>父pom所在项目的artifactId</artifactId>
      <version>父pom所在项目的版本号</version>
</parent>



//1.pom.xml



打包类型:packaging

  • jar:默认,将所有java文件编译为.class文件,且按照原来的层级结构放置,最终压缩为一个jar文件。一般是内部调用或作为服务使用
  • war:将所有java文件编译为.class文件,且将项目中依赖的所有jar包放在WEB-INF/lib文件夹,最终压缩为一个war文件。一般用于部署
  • pom:聚合、且父类都为pom类型



其他

  • 协议版本:modelVersion
  • 公司名称:name
  • 公司地址:url
  • 依赖集合:dependencies
  • 依赖:dependency



properties

  • 可在其中配置自定义属性。
  • 配置:<属性名>值</属性名>
  • 调用属性的值:${属性名}



作用域:scope

  • compile:默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些 dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布。
  • provided:跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。
  • runtime:表示 dependency 不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。
  • test:表示 dependency 作用在测试时,不作用在运行时。只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  • system:跟 provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在 repository 查找它。



版本号:version

  • SNAPSHOT(快照版本):动态监测 非稳定版本
  • RELEASE(正式版本):根据版本号监测 版本号一致则不更新 稳定版本



打包执行的插件:build



版权声明:本文为qq_51756226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。