美文网首页
Maven(一)

Maven(一)

作者: lizhencheng | 来源:发表于2019-03-29 00:54 被阅读0次

    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的依赖。

    相关文章

      网友评论

          本文标题:Maven(一)

          本文链接:https://www.haomeiwen.com/subject/uaxkbqtx.html