6.5. 构建这个多模块项目

既然simple-weather项目包含了所有与Yahoo! Weather服务交互的代码,以及simple-webapp项目包含了一个简单的servlet,是时间将这个应用编译并打包成一个WAR文件了。为此,你会想要以合适的顺序编译并安装这两个项目;以为simple-webapp依赖于simple-weathersimple-weatherJAR需要在simple-webapp项目被编译之前就被创建好。为此,你需要从simple-parent项目运行mvn clean install命令。

~/examples/ch06/simple-parent$ mvn clean install
[INFO] Scanning for projects...
[INFO] Reactor build order: 
[INFO]   Simple Parent Project
[INFO]   simple-weather
[INFO]   simple-webapp Maven Webapp
[INFO] ----------------------------------------------------------------------
[INFO] Building simple-weather
[INFO]    task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------
[...]
[INFO] [install:install]
[INFO] Installing simple-weather-1.0.jar to simple-weather-1.0.jar
[INFO] ----------------------------------------------------------------------
[INFO] Building simple-webapp Maven Webapp
[INFO]    task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------
[...]
[INFO] [install:install]
[INFO] Installing simple-webapp.war to simple-webapp-1.0.war
[INFO] 
[INFO] ----------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ----------------------------------------------------------------------
[INFO] Simple Parent Project ............................... SUCCESS [3.041s]
[INFO] simple-weather ...................................... SUCCESS [4.802s]
[INFO] simple-webapp Maven Webapp .......................... SUCCESS [3.065s]
[INFO] ----------------------------------------------------------------------

当Maven执行一个带有子模块的项目的时候,Maven首先载入父POM,然后定位所有的子模块POM。Maven然后将所有这些项目的POM放入到一个称为Maven 反应堆(Reactor)的东西中,由它负责分析模块之间的依赖关系。这个反应堆处理组件的排序,以确保相互独立的模块能以适当的顺序被编译和安装。

Note

除非需要做更改,反应堆一直维持定义在POM中的模块的顺序。为此一个有帮助的思维模型是,那些依赖于兄弟项目的项目在列表中被“向下按”,直到依赖顺序被满足。在很少的情况下,重新安排你构建的模块顺序可能很方便——例如你想要一个频繁的不稳定的模块接近构建的开端。

一旦反应堆解决了项目构建的顺序,Maven就会在多模块构建中为每个模块执行特定的目标。本例中,你能看到Maven在simple-webapp之前构建了simple-weather,为每个子模块执行了mvn clean install

Note

当你在命令行运行Maven的时候你经常会在任何其它生命周期阶段前指定clean生命周期阶段。当你指定clean,你就确认了在编译和打包一个应用之前,Maven会移除旧的输出。运行clean不是必要的,但这是一个确保你正执行“干净构建”的十分有用的预防措施。