构建工具(三):Maven包介绍

2018-12-03  本文已影响2人  亦猿非猿

对Maven包中的pom文件进行详细介绍,包括groupId、artifactId、version等,和对依赖管理进行详细介绍。并列出常用的Maven命令。

Maven包

一个Maven项目中,最重要就是pom文件了,可以在上一篇文章中生成的helloworld项目的根目录下就找到它,其实就是一个xml文件。

POM(工程对象模型)文件

POM文件内,包含了Maven包的坐标,通过该坐标元素,我们就可以找到对应的构件,任何一个构件都可以使用Maven坐标唯一标识。

下面截取一部分内容进行分析

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="h ttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.guidongyuan.testmaven</groupId>
  <artifactId>helloworld</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>aar</packaging>
  <name>helloworld</name>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

必选项

可选项

依赖

第一章中,我们讲到了Maven的作用之一,依赖管理。

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

根元素下project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

必选项

可选项

依赖范围

Maven在编译主代码的时候需要使用一套classpath,在编译和执行测试的时候会使用另一套classpath,实际运行项目的时候,又会使用一套classpath。

依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有以下几种依赖范围:

总结
依赖范围(scope) 测试classpath 编译classpath 运行classpath 例子
compile spring-core
test servlet-api
provided junit
runtime JDBC驱动实现
system 本地的,Maven仓库之外的类库文件

传递性依赖

传递性依赖是在maven2中添加的新特征,这个特征的作用就是你不需要考虑你依赖的库文件所需要依赖的库文件,能够将依赖模块的依赖自动的引入。假设项目project-B依赖项目project-C,项目project-A依赖项目Project-B,那么project-A也传递性依赖project-C。

依赖调整原则

如果不同的依赖,有引用了相同的依赖,则需要对依赖进行调整。一般遵循下面两个原则

可选依赖

Maven的依赖是有传递性的,但是有时候,project-A可能不是必需依赖project-C,那么,就可以设置选择性依赖的属性。在project-B的依赖配置文件中,添加optional属性并且设置为true

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

如果project-A需要依赖project—C,那么就需要在pom.xml中重新配置对project—C的依赖。

依赖排除

当一个项目Project-A依赖项目Project-B,而项目Project-B同时依赖项目Project-C,如果项目Project-A中因为各种原因不想引用项目Project-C,在配置项目Project-B的依赖时,可以排除对C的依赖。如果项目Project-B的开发人员没有为Project-C的依赖设置optional属性为true,则我们需要在Project-A的配置文件中去排除它。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample.ProjectA</groupId>
  <artifactId>Project-A</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>sample.ProjectC</groupId> <!-- Exclude Project-C from Project-B -->
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>

Maven依赖常用命令

参考资料

上一篇 下一篇

猜你喜欢

热点阅读