IntelliJ Idea14 創建Maven多模塊項目


Maven多模塊項目的參考資料

Sonatype上的教程 http://books.sonatype.com/mvnex-book/reference/multimodule.html

在這個教程里, 提供了一個多模塊的maven項目例子供下載, 可以直接套用於實際項目.

IntelliJ Idea14里的創建步驟

1. File -> New -> Project -> Maven, 選擇SDK后, 不要選Create from archetype, -> Next, 

2. 填寫GroupId, 例如 com.mydomain.myproject, 填寫ArtifactId, 例如 hold-on-service 我建的是dubbo項目, 這里填個大service名稱, Version 默認, -> Next

3. 填寫Project name, 就用ArtifactId, 如 hold-on-service, 選好項目地址, -> Finish

4. 新建好的項目里, 刪掉系統創建的src目錄

5. 開始創建子模塊. File -> New -> Module -> Maven, 如果是公共模塊, 就不要選Create from archetype, -> Next, 如果不是公共模塊, 例如是實際的service提供模塊, 則根據需要選擇相應模板.

6. GroupId和版本按默認, ArtifactId 根據模塊類型填寫, 例如 hold-on-service-api, 或者 hold-on-service-impl, 一路Next -> Finsh

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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM