`
wanghaisheng
  • 浏览: 91711 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

maven学习7——实践maven2:参与多个项目构建

阅读更多

实践 Maven 2:参与多个项目构建

使用 Maven 2 构建和测试简单项目是很直接的。本部分用第二个例子来展示更现实也更为通用的多模块项目。

扩展 NumOps 样例

NumOps 的例子将在此处的第二个例子里得到扩展。添加一个新 SubOps 类来支持减法,添加一个新 MulOps 类来支持乘法。

Operation 接口和 AddOps 类现在己从 NumOps 项目中移走。相反,它们和新的 SubOpsMulOps 类一起放到了一个叫做 OpsImp 的新项目中。图 7 显示了 NumOpsOpsImp 项目间的这种关系:


图 7. NumOps 和 OpsImp 间的关系
NumOps 和 OpsImp 间的关系

在大型软件开发项目中,子项目和子模块之间常存在依赖性。您可以将这里的这项技术应用到有着多个相互依赖项的任何多模块 Maven 项目中。

清单 13 里的 SubOps 在编码上和 AddOps 类似。这里没有显示的 MulOps 也类似;您可以看一下随附的代码来了解详情(参见 下载)。


清单 13. 实现 Operation 接口的新 SubOps 类

                    
package com.ibm.devworks;

public class SubOps implements Operation {
   public int op(int a, int b) {
      return a-b;
   }
   public String getDesc() {
      return "minus";
   }
}

 

现在修改了 NumOps 的构造函数来创建一个 SubOps 实例和一个 MulOps 实例。参见随附的源代码获取详情。


创建主项目

为和这两个项目一起运行,主项目创建在比 NumOpsOpsImp 的项目目录高一级的目录。NumOpsOpsImp 项目都使用标准 Maven 项目目录布局。在最顶部,项目目录只包含一个 pom.xml 文件。图 8 显示了新的子目录结构,紧跟在主目录之下:


图 8. 多模块项目的目录结构
多模块项目的目录结构

可以在分发代码的 example2 子目录中找到这个多模块项目的代码(参见 下载)。清单 14 显示了顶层的 pom.xml 文件:


清单 14. 多模块项目顶层的 pom.xml 文件

                    
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ibm.devworks</groupId>
  <artifactId>mavenex2</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Example 2</name>
  <url>http://maven.apache.org</url>
<modules>
 <module>NumOps</module>
 <module>OpsImp</module>
</modules>
   <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>   
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
<dependencyManagement>
                    <dependencies>
                        <dependency>
                          <groupId>com.ibm.devworks</groupId>
                          <artifactId>OpsImp</artifactId>
                          <version>${project.version}</version>
                        </dependency>
                      </dependencies>
                    </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

 

新代码以粗体突出显示。首先,这个主项目的工件 ID 是 mavenex2,其打包类型是 pom。这向 Maven 2 传递出这样的信号:这是一个多模块项目。

随后,<modules> 标记指定组成此项目的两个模块:NumOpsOpsImp

这个主项目的子模块能从这个 pom.xml 文件中继承属性。说得更具体一点,这些子模块都不需要将 JUnit 声明为一个依赖项,即使它们都包含单元测试。这是因为它们继承了顶层定义的 JUnit 依赖项。

<dependencyManagement> 标记不指定此模块依赖的依赖项。相反,它主要由子模块使用。子模块能指定 <dependencyManagement> 标记中任何条目的依赖项,而无需指定具体的版本号。当项目树更改依赖项的版本号时,这很有用,可以使需编辑的条目数目最小化。在本例中,OpsImp 项目的版本号是使用 ${project.version} 指定的。在执行 Maven 时,这是一个会被相应值所填充的参数。


从主 POM 中继承

前进到下一层的 OpsImp 目录,可以找到该模块的 pom.xml 文件,如清单 15 所示:


清单 15. 新 OpsImp 项目的 pom.xml 文件

                    
<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/maven-v4_0_0.xsd">
  <parent>
   <groupId>com.ibm.devworks</groupId>
    <artifactId>mavenex2</artifactId>
    <version>1.0-SNAPSHOT</version>
   </parent> 
  <modelVersion>4.0.0</modelVersion>
  <artifactId>OpsImp</artifactId>
  <packaging>jar</packaging>
 </project>

 

<parent> 元素指定此模块所继承自的主 POM。从父模块中继承极大地简化了这个 pom.xml。只需要覆盖该工件 ID 并打包。此模块继承了其父模块的依赖项:JUnit 模块。

NumOps pom.xml 也从其父模块中继承,也相当简单。这个 pom.xml 显示在清单 16 中:


清单 16. NumOps 项目中显示 POM 继承关系的 pom.xml

                    
<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/maven-v4_0_0.xsd">
  <parent>
   <groupId>com.ibm.devworks</groupId>
    <artifactId>mavenex2</artifactId>
    <version>1.0-SNAPSHOT</version>
   </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>NumOps</artifactId>
  <packaging>jar</packaging>
  <dependencies>
                        <dependency>
                          <groupId>com.ibm.devworks</groupId>
                          <artifactId>OpsImp</artifactId>
                         </dependency>
                      </dependencies>
</project>

 

发现有效的 POM

只要从一个高层 POM 中继承,您总能在了解了所有继承元素后发现相对应的 pom.xml 是什么样。显示 “effective POM” 的命令是 mvn help:effective-pom。您将看到一些您还没有指定的元素。这些都是从 Super POM 中继承的。每个项目 pom.xml 都从 Maven 内嵌的 Super POM 中隐式地继承。

NumOps POM 中有意思的一处是将 OpsImp 项目指定为一个依赖项。请注意,在这个依赖项中没有指定任何版本号。在它的父项目的 <dependencyManagement> 元素里已经指定了首选的版本号。

在项目顶层,现在可以用 mvn compile 命令编译全部两个模块,或用 mvn test 命令为两个模块运行单元测试。也可以运行 mvn install 将打包的模块安装到本地目录中。这使得任何依赖于它的模块可以不访问源代码就能解析依赖项。

分享到:
评论

相关推荐

    Maven 教程:基础篇-尚硅谷学习笔记 2022年

    Maven支持多模块项目结构,允许开发者将大型项目划分为多个子项目,每个子项目都有自己的POM,且共享父POM的配置。 ### 9. 父POM与继承 父POM可以包含共有的配置,如依赖、插件和属性,子项目通过继承父POM来减少...

    项目构建maven

    【标题】"项目构建maven" 是一个关于Java Web项目构建的重要工具,它在软件开发过程中扮演着核心角色。Maven是由Apache软件基金会开发的项目管理和综合工具,它通过使用一种标准化的项目对象模型(Project Object ...

    Maven2 5分钟学习教程(中文)----maven2 官方文档翻译

    **Maven 2 5分钟学习教程(中文)——官方文档翻译** Maven是一个强大的Java项目管理工具,它简化了构建、依赖管理和项目生命周期的管理。这篇5分钟学习教程是Maven 2官方文档的中文翻译,旨在帮助初学者快速理解和...

    apache-maven-3.3.9版本.zip

    Apache Maven 是一个强大的项目管理和构建工具,主要用于Java项目。...通过学习和掌握Maven,开发者可以提高项目构建的效率,减少手动配置的工作量,同时也可以更好地利用社区资源,实现项目的快速开发和部署。

    maven多模块web项目

    【标题】"maven多模块web项目"是一个基于Maven构建的复杂Web应用程序,它将项目分解为多个独立的模块,每个模块都有特定的功能或组件,这样可以提高代码的可维护性和可重用性。Maven是Apache软件基金会开发的一款...

    持续集成环境搭建——maven、git、jenkins、tomcat

    Apache Maven是一个项目管理和综合工具,它可以帮助开发者管理项目构建、报告、依赖关系等。以下是maven的安装步骤: 1. 访问Apache官网(http://maven.apache.org/download.cgi)下载最新版的maven安装包。 2. 解...

    Maven权威指南,学习参考手册

    ### Maven权威指南:深入解析与实战应用 #### 引言:Maven——自动化构建与项目管理的...通过本书的学习,开发者能够掌握Maven的核心理念和最佳实践,从而提升项目构建的效率和质量,使项目管理更加规范化和自动化。

    Maven兼容jdk1.7版本

    【标题】"Maven兼容jdk1.7版本"指出的核心知识点是关于Apache Maven的一个特定版本——3.0.5,这个版本与Java Development Kit (JDK) 1.7(也称为Java 7)有着良好的兼容性。在软件开发过程中,构建工具如Maven与...

    Maven3实战笔记08Maven反应堆

    ### Maven3实战笔记08——Maven反应堆:深度解析与实战应用 #### Maven反应堆的概念与作用 在深入探讨Maven反应堆之前,我们首先需要理解Maven项目是如何组织和构建的。Maven是一种自动化构建工具,它通过定义项目...

    maven - maven tutorial

    Maven 自发布以来经历了多个版本的迭代,包括但不限于 Maven 1.x、Maven 2.x 和 Maven 3.x。每个版本都带来了显著的功能改进和技术优化,提高了项目的构建效率和可维护性。 **1.3 Maven 的目标** Maven 的主要目标...

    Maven 多项目依赖关系

    在软件开发过程中,管理多个项目的依赖关系是一项复杂而重要的任务。Maven,作为一个强大的构建工具,可以帮助我们有效地解决这个问题。Maven使用一个统一的配置方式,使得项目间的依赖关系清晰明了,便于维护和更新...

    Maven学习资源打包汇总

    在学习这些资料时,首先要理解Maven的核心理念——“约定优于配置”,这意味着Maven提供了一套标准的项目结构和默认的构建流程。其次,深入学习POM.xml文件,它是Maven项目的中心,包含了项目信息、依赖、构建配置等...

    Maven《实战》许晓斌完整版包含源码

    7. **多模块项目**: 如何组织和管理大型的多模块项目,包括聚合项目(Aggregator)和模块(Module)的关系。 8. **源码管理和版本控制**: 结合Git等版本控制系统,讨论如何与Maven配合使用。 9. **Maven的扩展**: ...

    eclipse使用maven整理文档.rar_captured7ne_eclipse mavenhelper_maven

    【标签】"captured7ne eclipse_mavenhelper maven"暗示了这个压缩包可能包含了Eclipse的一个插件——Maven Helper,这是一个Eclipse IDE的辅助工具,它可以帮助用户更好地理解和管理Maven项目中的依赖关系,例如显示...

    maven-3.2.5 java

    4. **生命周期与阶段**:Maven有三个主要生命周期——clean、default和site,每个生命周期包含多个阶段,开发者可以自定义执行哪些阶段。 ** 总结 ** Maven 3.2.5作为一款强大的Java项目管理工具,通过其丰富的...

    maven3.6.3.rar

    在Maven中,每个项目都有一个对应的POM.xml文件,它是Maven工作的基础。通过POM,Maven能够自动下载项目所需的依赖库,并管理这些库的版本,极大地简化了项目的构建过程。 Maven 3.6.3版本引入了一些关键改进和优化...

    手动创建maven工程

    每个阶段包含多个目标(phase),如compile、test、install等,这些目标按照特定顺序执行。 6. **插件管理**:除了内置的目标,Maven还允许使用插件扩展功能。在pom.xml中定义插件配置,如使用`maven-jar-plugin`...

    简单的maven+SSM小项目

    2. **Maven生命周期**:Maven有多个生命周期阶段,如clean(清理)、default(构建)和site(生成站点文档)。例如,`mvn clean compile`会清理目标目录,然后编译源代码。 3. **Maven仓库**:Maven使用本地仓库...

    201205_Maven学习笔记1.rar

    Maven允许开发者将大型项目分解为多个互相依赖的小模块,每个模块都有自己的POM(Project Object Model)文件,便于独立构建和测试。这样可以提高代码的可维护性和复用性。 2. [20120527]发布项目到私有仓库.doc:...

Global site tag (gtag.js) - Google Analytics