Maven(一)

2019-03-29  本文已影响0人  lizhencheng

Maven 概念

Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。

Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

Maven POM

<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">
 
    <modelVersion>4.0.0</modelVersion>
    <!-- 模型版本 -->

    <groupId>com.companyname.project-group</groupId>
    <!-- 
    公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 
    如com.companyname.project-group,maven会将该项目打成的
    jar包放本地路径:/com/companyname/project-group 
    -->

    <artifactId>project</artifactId>
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->

    <version>1.0</version>
    <!-- 版本号,在 artifact 的仓库中,它用来区分不同的版本。例如:
    com.company.bank:consumer-banking:1.0 
    com.company.bank:consumer-banking:1.1
    -->

    <packaging>jar</packaging>
    <!-- 打包类型(jar、war),默认情况为jar -->

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <!-- 
    元素用户可以自定义一个或多个Maven属性,然后在POM的其他
    地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理 
    -->

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.aaa.bbb</groupId>
                <artifactId>ccc</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- 
    只会出现在父pom文件里面,通过它来管理jar包的版本,
    让子项目中引用一个依赖而不用显示的列出版本号。Maven会
    沿着父子层次向上走,直到找到一个拥有dependencyManagement
    元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号 
    -->

</project>

Dependency Scope

scope 元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。

compile

含义:compile 是默认值,如果没有指定 scope 值,该元素的默认值为 compile。被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。打包的时候通常会包含被依赖项目。

provided

含义:被依赖项目理论上可以参与编译、测试、运行等阶段,相当于compile,但是在打包阶段做了exclude的动作。
适用场景:例如, 如果我们在开发一个web 应用,在编译时我们需要依赖 servlet-api.jar,但是在运行时我们不需要该 jar 包,因为这个 jar 包已由应用服务器提供,此时我们需要使用 provided 进行范围修饰。

runtime

含义:表示被依赖项目无需参与项目的编译,但是会参与到项目的测试和运行。与compile相比,被依赖项目无需参与项目的编译。
适用场景:例如,在编译的时候我们不需要 JDBC API 的 jar 包,而在运行的时候我们才需要 JDBC 驱动包。

test

含义: 表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。
适用场景:例如,Junit 测试。

system

含义:system 元素与 provided 元素类似,但是被依赖项不会从 maven 仓库中查找,而是从本地系统中获取,systemPath 元素用于制定本地系统中 jar 文件的路径。也就是说,在编译时使用 systemPath 元素指定的 jar 包,在运行时由应用服务器提供 jar 包。
适用场景:项目中存在自定义的基础组件服务时使用。例如:

<dependency>
    <groupId>org.open</groupId>
    <artifactId>open-core</artifactId>
    <version>1.5</version>
    <scope>system</scope>
    <systemPath>${basedir}/WebContent/WEB-INF/lib/open-core.jar</systemPath>
</dependency>

Dependency Exclusions

(1)当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。
(2) 示例(假设配置的是A的pom.xml,依赖关系为:A –> B; B –> C):

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectC</groupId>
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

Optional Dependencies

示例:

<project>
 ...
 <dependencies>
   <!-- declare the dependency to be set as optional -->
   <dependency>
     <groupId>sample.ProjectB</groupId>
     <artifactId>Project-B</artifactId>
     <version>1.0</version>
     <scope>compile</scope>
     <optional>true</optional> <!-- value will be true or false only -->
   </dependency>
 </dependencies>
</project>

假设以上配置是项目A的配置,即:Project-A --> Project-B。在编译项目A时,是可以正常通过的。

如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。

上一篇下一篇

猜你喜欢

热点阅读