maven pom文件

什么是pom

POM表明“项目对象模型”。它是一个名为pom.xml的文件,是Maven项目的XML表示形式。 在Maven眼中,一个项目根本不须要包含任何代码,只须要一个pom.xmlmysql

pom 内容

这是直接位于project元素下的元素列表sql

请注意,modelVersion 为 4.0.0 这是目前惟一支持Maven 2和3的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>
 
  <!-- The Basics -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>...</packaging>
  <dependencies>...</dependencies>
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement>
  <modules>...</modules>
  <properties>...</properties>
 
  <!-- Build Settings -->
  <build>...</build>
  <reporting>...</reporting>
 
  <!-- More Project Information -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>
 
  <!-- Environment Settings -->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists>
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>
复制代码

Maven坐标

<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>org.codehaus.mojo</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>
复制代码

上面定义的POM是Maven容许的最小值。groupId、artifactId、version是必填字段,他们三者构成了 maven 的惟一坐标。apache

  • <groupId> : 组织id,推荐公司域名反写,例如com.ailibaba
  • <artifactId>:项目名称
  • <version>:版本号

打包

经过坐标咱们在maven中定义了一个项目,除此以外咱们还须要告诉maven咱们要如何打包这个项目tomcat

<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">
    ...
    <packaging>war</packaging>
    ...
</project>
复制代码

如上,咱们指定打包方式为 war包,经常使用的还有jarbash

依赖

Maven的一个强大功能是它处理项目关系:这包括依赖项(和传递依赖项),继承和聚合(多模块项目)oracle

若是你的项目须要依赖其余项目,就必须配置依赖框架

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    ...
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <type>jar</type>
            <scope>test</scope>
            <optional>true</optional>
        </dependency>
        ...
    </dependencies>
    ...
</project>
复制代码

不是全部依赖项均可以在 maven 仓库中找到,要配置这种依赖,可使用install插件在本地安装。maven

mvn install:install-file -Dfile = c:\\non-maven-proj.jar -DgroupId = some.group -DartifactId = non-maven-proj -Dversion = 1 -Dpackaging = jar
复制代码
  • groupId、artifactId、version: 以前讲过,这是一个项目的坐标
  • type:依赖包类型,默认为jar

scope

scope 有两个做用ide

  1. 指的依赖的做用范围
  2. 限制依赖的传递

做用范围

包括项目的测试、编译、运行、打包等生命周期。其中,编译和运行还分为

  • 测试代码的编译和运行
  • 非测试代码的编译和运行

scope 的五个可选值,分别是

  • compile :这是默认范围,参与编译、测试、运行、打包等生命周期,可传递

  • provided :参与编译、测试、运行,不参与打包,不可传递。依赖由运行的环境提供,好比tomcat或者基础类库等

  • runtime :不参与编译,参与测试、运行,可传递。好比JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才须要具体的mysql、oracle等等数据的驱动程序。

  • test 该依赖仅参与测试用例的编译和执行,不可传递,好比Junit。

  • system :范围依赖与provided 类似,但依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找,须要 systemPath 属性。

传递依赖

A -> B -> C, 当前项目 A,A依赖于B,B依赖于C,知道B在 A中的scope,怎么知道 C在 A 中的 scope

即,A需不须要 C的问题,本质由 C在B中的scope决定

当 C 在 B 中的scope 是test 或 provided 时,C 直接被丢弃,A不依赖C

不然 A 依赖 C,C的scope 继承与B 的scope

optional

optional 表示可选依赖,它的值有两种

  • true:可选依赖
  • false:默认值,非可选依赖

在Maven中可选依赖是不会进行传递的

什么是可选依赖? 假如A依赖B,B中有可选依赖C,那么除非A显示声明,不然可选依赖包是不会导入进依赖的。

为何要有可选选依赖?

好比,一个持久层模块不但能够持久化Oracle数据库,也能够持久化Mysql数据库,那么在这个持化层框架中应该对应了两份代码,一份是关于Oracle持久化的处理,一份是关于Mysql持久化的处理,若是将持久层模块的Oracle与Mysql驱动均设置为非可选依赖,那么依赖这个持久层框架的项目类路径中将同时出现Mysql以及Oracle的驱动Jar包,若是真的这样,你会不会感受到这种设计很奇葩,所以Maven经过Optional关键字来处理这种问题

相关文章
相关标签/搜索