既然simple-weather
项目包含了所有与Yahoo!
Weather服务交互的代码,以及simple-webapp
项目包含了一个简单的servlet,是时间将这个应用编译并打包成一个WAR文件了。为此,你会想要以合适的顺序编译并安装这两个项目;以为simple-webapp
依赖于simple-weather
,simple-weather
的JAR需要在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
不是必要的,但这是一个确保你正执行“干净构建”的十分有用的预防措施。