美文网首页
Maven学习笔记

Maven学习笔记

作者: tenlee | 来源:发表于2017-05-11 16:43 被阅读169次

    阅读《Maven实战》许晓斌的一些笔记,便于自己和道友查阅

    maven依赖

    maven具有传递性依赖,比如 A 依赖 B 项目,B 项目依赖C项目,同时B项目可选依赖D项目,那么C就会成为A的范围依赖,而D不会成为A的范围依赖。A对于B是第一直接依赖,B对于C是第二直接依赖,A对与C是传递性依赖。

    • 依赖范围影响传递性依赖图表, 最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围:
    compile test provided runtime
    compile compile -- -- runtime
    test test -- -- test
    provided provided -- provided provided
    runtime runtime -- -- runtime
    • 依赖调解,第一原则:路径最近优先,第二原则:第二声明者优先。
    • 可选依赖声明:
    <project>
    ...
        <dependency>
            <group>mysql</group>
            <artifactid>mysql-connector-java</artifactid>
            <version>5.1.10</version>
            <optional>true</optional><!-- 表示这个依赖为可选性依赖 -->
        </dependency>
    ...
    </project>
    
    • 排除依赖,某些时候我们不需要某些传递性依赖,可以在在pom文件的<dependency>部分增加<exclusions> 标签排除:
    <project>
      ...
      <dependencies>
        <dependency>
          <groupId>sample.ProjectA</groupId>
          <artifactId>Project-A</artifactId>
          <version>1.0</version>
          <scope>compile</scope>
          <exclusions>
            <exclusion>  <!-- declare the exclusion here -->
              <groupId>sample.ProjectB</groupId>
              <artifactId>Project-B</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    </project>
    
    • 优化依赖
      使用mvn dependency:list或者mvn dependency:tree查看项目依赖详情
      使用 mvn dependency:analyze进行分析。

    maven的聚合和继承

    • 聚合,
      一个项目分为多个模块,即多个maven项目,聚合可以时多个模块同时执行mvn命令等。
    <project>
        ...
        <groupId>com.example</groupId>
        <artifactId>module-0</artifactId>
        <packaging>pom</packaging>  <!-- packing 类型必须为 pom-->
        <name>Parent Project</name>
        <modules>
            <module>module-1</module>
            <module>module-2</module>
        </modules>
        ...
    <project>
    

    这里的每个module的值都是一个当前POM的相对目录,比如module-0的目录为/home/user/module-0,则module-1的目录应该为/home/user/module-0/module-1,
    module-2的目录应该为/home/user/module-0/module-2, module的值为相对路径或者绝对路径,且是模块的目录名,而不是模块的artifactId值。建议目录名即为artifactId值。

    • 继承
      如果pom存在许多相同的配置,可以通过继承解决
      一个例子
      父pom
    <?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="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.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>  <!-- packing 类型必须为 pom-->
        <name>Parent Project</name>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.compiler.source>1.8</java.compiler.source>
            <java.compiler.target>1.8</java.compiler.target>
            <spring.version>4.3.8.RELEASE</spring.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${spring.version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.6.1</version>
                        <configuration>
                            <encoding>${project.build.sourceEncoding}</encoding>
                            <source>${java.compiler.source}</source>
                            <target>${java.compiler.target}</target>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    

    子pom

    <?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="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <artifactId>parent-project</artifactId>
            <groupId>com.example</groupId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../parent-project/pom.xml</relativePath>
        </parent>
    
        <artifactId>child-1</artifactId>
        <name>Child Project 1</name>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    父pom的packaging类型必须为pom,父模块只是为了帮助消除配置的重复,所以它本身不包含除了pom之外的项目文件。

    子pom继承的时候,parent下的子元素groupId, artifactId, version是必填的。元素relativePath表示父模块pom的相对路径。项目构建时,maven首先根据relativePath检查父pom,如果没有,则在本地仓库查找(mvn install 即安装了本地仓库)。relativePath的默认值是../pom.xml,也就是说,maven默认父pom在上一层目录下。

    可继承的pom元素有如下groupId, version, description, organization, inceptionYear, url, developers, contributors, distributionManagement, issueManagement, ciManagement, scm, mailingLists, properties, dependencies, dependencyManagement, repositories, build, reporting

    在子pom文件中,所有的依赖和插件只配置了groupId 和 artifactId,省去了version, scope等。这样能够通过父pom统一依赖版本,范围等。如果子模块不声明依赖的使用,即使依赖已经在父pom的dependencyManagement或者pluginManagement,也不会对子模块产生影响。而不在父pom的dependencyManagement或者pluginManagement中的依赖,则会被子模块继承。

    • 聚合和继承的关系
      聚合是为了快速构建项目,而继承是为了消除重复配置。
      同时一个pom既可以是聚合pom也可以是父pom。

    • 裁剪反应堆
      当需要构建整个项目或者选择构建单个模块,就需要实时的裁剪反应堆。例如
      -am 同时构建所列模块的依赖模块, 例如 mvn clean -am
      -amd同时构建依赖于所列模块的模块
      -pl构建指定模块,模块间用英文逗号分隔
      -rf 充只等的模块回复反应堆,

    其他


    推荐阅读
    maven官方指南
    可选的依赖和依赖排除
    Maven 资源过滤相关
    使用 Maven Profile 和 Filtering 打各种环境的包
    profile介绍
    使用Nexus创建私服
    使用Hudson进行持续集成
    Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

    相关文章

      网友评论

          本文标题:Maven学习笔记

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