《Maven权威指南》学习笔记十七_一个多模块项目


场景:父模块包含两个子模块,子模块2依赖子模块1。


父模块POM配置如下例:
[...]  
  <packaging>pom</packaging>
  [...]
  <modules>
    <module>simple-weather</module><!--子模块1-->
    <module>simple-webapp</module><!--子模块2-->
  </modules>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>1.5</source>
            <target>1.5</target>
          </configuration>
        </plugin>
      </plugins>
   </pluginManagement> 
  </build>
  [...]
像这样如果 仅仅提供项目对象模型的项目,正确的的打包 类型是pom。
compiler插件默认绑定到了Maven的生命周期,我们可以使用pluginManagement部分来配置。pluginManagement以后再细说。

子模块1 POM配置:
 [...]
  <parent> <!--父配置-->
    <groupId>org.parent.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>2.0</version>
    <relativePath>../parentArtifactId</relativePath>
  </parent>
  <artifactId>simple-weather</artifactId><!--子配置-->
  <packaging>jar</packaging><!--Jar工程-->
  <name>Chapter 6 Simple Weather API</name>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId><!--Surefire测试插件-->
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
            <testFailureIgnore>true</testFailureIgnore>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement> 
  </build>
[...]
relativePath是可选的,maven在搜索本地和远程repositories之前会首先搜索这个地址的POM。
子模块的groupId和Version可沿用父POM的配置,单独配置artifactId和packaging等其他信息。


子模块2 POM配置:

  [...]
  <parent><!--父配置-->
    <groupId>org.parent.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>2.0</version>
    <relativePath>../parentArtifactId</relativePath>
  </parent>
  <artifactId>simple-webapp</artifactId><!--子配置-->
  <packaging>war</packaging><!--WebApp项目-->
  
  <dependencies>
    <dependency>
      <groupId>org.apache.geronimo.specs</groupId>
      <artifactId>geronimo-servlet_2.4_spec</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>org.sonatype.mavenbook.ch06</groupId><!--对子模块1的依赖-->
      <artifactId>simple-weather</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>simple-webapp</finalName>
    <plugins>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
 [...]
到父目录下执行:mvn clean install

当Maven执行一个带有子模块的项目的时候,Maven首先载入父POM,然后定位所有的子模块POM。Maven然后将所有这些项目的POM放入到一个称为Maven 反应堆(Reactor)的东西中,由它负责分析模块之间的依赖关系。这个反应堆处理组件的排序,以确保相互独立的模块能以适当的顺序被编译和安装。一旦反应堆解决了项目构建的顺序,Maven就会在多模块构建中为每个模块执行特定的目标。
切换到子模块2(WebApp工程)执行:mvn jetty:run。

解释:
  • clean不是必要的,但在一个干净的环境下构建能够避免意外的异常
  • install最终按序打包各个模块安装到本地仓库


你可能感兴趣的:(maven,Module)