Maven多模塊項目的參考資料html
Sonatype上的教程 http://books.sonatype.com/mvnex-book/reference/multimodule.htmljava
在這個教程裏, 提供了一個多模塊的maven項目例子供下載, 能夠直接套用於實際項目.mysql
IntelliJ Idea14裏的建立步驟git
1. File -> New -> Project -> Maven, 選擇SDK後, 不要選Create from archetype, -> Next, spring
2. 填寫GroupId, 例如 com.mydomain.myproject, 填寫ArtifactId, 例如 hold-on-service 我建的是dubbo項目, 這裏填個大service名稱, Version 默認, -> Nextsql
3. 填寫Project name, 就用ArtifactId, 如 hold-on-service, 選好項目地址, -> Finishapache
4. 新建好的項目裏, 刪掉系統建立的src目錄api
5. 開始建立子模塊. File -> New -> Module -> Maven, 若是是公共模塊, 就不要選Create from archetype, -> Next, 若是不是公共模塊, 例如是實際的service提供模塊, 則根據須要選擇相應模板.springboot
6. GroupId和版本按默認, ArtifactId 根據模塊類型填寫, 例如 hold-on-service-api, 或者 hold-on-service-impl, 一路Next -> Finshsession
7. 編輯主項目的pom.xml, 注意要指定compile的source和target, 否則每次IDEA裏面reimport以後, 配置都會被重置, 每次要改很麻煩
<?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.mydomain.holdon</groupId> <artifactId>vk-session</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>Holdon Project: Session Service</name> <modules> <module>session-service-api</module> <module>session-service-impl</module> </modules> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
8. 編輯公共子模塊的pom.xml, 注意packaging類型
<?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>vk-session</artifactId> <groupId>com.mydomain.holdon</groupId> <version>1.0-SNAPSHOT</version> </parent> <name>Holdon Project: Session Service API</name> <artifactId>vk-session-api</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> </dependencies> </project>
9. 編輯實體子模塊的pom.xml, 注意這裏要添加對公共模塊的依賴, 否則每次reimport後, 依賴關係會丟失
<?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>vk-session</artifactId> <groupId>com.mydomain.holdon</groupId> <version>1.0-SNAPSHOT</version> </parent> <name>Holdon Project: Session Service Publish</name> <artifactId>vk-session-impl</artifactId> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.springframework.version>3.1.1.RELEASE</org.springframework.version> </properties> <dependencies> <!-- Spring Dependencies Start --> <!-- Core utilities used by other modules, Define this if you use Spring Utility APIs(org.springframework.core.*/org.springframework.util.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Spring Dependencies End --> ...... <dependency> <groupId>com.mydomain.holdon</groupId> <artifactId>vk-session-api</artifactId> <version>${project.version}</version> </dependency> </dependencies> </project>
能夠設置一個全局的pom, 把全部的模塊都組織起來.一些公司裏公用的dependency以及版本, 都配置在
這個pom只配置在svn和CI工具裏, deploy的時候, 會自動checkout整個最新的主幹, deploy到maven repository.
開發的時候, 只須要使用這個下面的大模塊, pom裏面的parent, maven會自動到repository下找依賴.
Update: 新建項目時, 用最頂層的pom建, 會自動變成多層模塊的項目, 而後把頂層的項目delete掉, 而後第二層的module就變成頂層了, 並且頂層的pom.xml還在項目裏.
Update 2017-04-08: 以上適用於使用svn倉庫的項目, 不適用於git
Update 2018-10-11: 在Maven 中除了用繼承parent來作版本控制之外, 還能夠經過 scope=import 來作版本控制.
Maven 2.0.9 添加了一個新特性: scope = import 也就是從外部導入依賴管理的依賴配置. 使用過 DependencyManagement都知道, 多模塊構建項目的時候, 爲了解決各模塊依賴版本一致, 統一在父pom.xml文件中統必定義各個依賴jar文件的版本, 而後子模塊經過引用的方式添加須要的依賴jar, 但隨着項目工程愈來愈大, 添加的依賴文件也越來也多, 父pom.xml的 DependencyManagement 也會愈來愈長, 不便於管理. 另外, 由於pom.xml 是單繼承的, 若是已經有一個父pom.xml了, 想要再引用外部的pom.xml, 就只能複製到父pom.xml中了. 所以採用在 DependencyManagement 中使用scope = import的方式能夠分類引入更多的管理配置, 也擺脫了單繼承的限制. 舉例, 在子模塊的<project></project>中增長這一段用於引入其餘pom.xml的依賴配置
<dependencyManagement> <dependencies> <dependency> <groupId>com.rockbb</groupId> <artifactId>my-java-pom</artifactId> <version>1.2-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
而這個被引入的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.rockbb</groupId> <artifactId>my-java-pom</artifactId> <version>1.2-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <kbsjava.default.version>1.2-SNAPSHOT</kbsjava.default.version> <springboot.version>2.0.3.RELEASE</springboot.version> <c3p0.version>0.9.5.2</c3p0.version> <mysql.version>6.0.3</mysql.version> <mybatis.version>3.4.1</mybatis.version> <mybatis-spring.version>1.3.0</mybatis-spring.version> ... <dom4j.version>2.1.1</dom4j.version> </properties> <repositories> <repository> <id>...</id> <name>...</name> <url>https://...</url> </repository> </repositories> <distributionManagement> <repository> <id>...</id> <name>...</name> <url>https://...</url> </repository> <snapshotRepository> <id>...</id> <name>...</name> <url>https://...</url> <uniqueVersion>false</uniqueVersion> </snapshotRepository> </distributionManagement> <dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> ... <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>${dom4j.version}</version> </dependency> </dependencies> </dependencyManagement> </project>