maven-idea構建多模塊項目-maven的聚合和繼承

多模塊效果圖

1. 操作步驟

將多個子項目聚合在一個父工程中靴庆,子項目中册养,可引入parent標簽构拳,即:繼承父工程蕊梧。

第一步:選擇maven
第二步:填寫信息
第三步:點擊完成
第四步:刪除src目錄
第五步:選擇module
第六步:選擇maven工程
第七步:配置module
第八步:配置完成
父pom:maven的聚合
子pom:maven的繼承

創(chuàng)建其他的module模塊霞赫。

2. 依賴關系

1. 父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.tellme</groupId>
    <artifactId>springboot-client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--自動生成的子模塊依賴-->
    <modules>
        <module>mm-web</module>
        <module>mm-service</module>
        <module>mm-repo</module>
        <module>mm-entity</module>
    </modules>
    <packaging>pom</packaging>

    <!--properties總體配置文件-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <commons.lang3.version>3.5</commons.lang3.version>
    </properties>

    <!--繼承springboot提供的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!--版本統(tǒng)一聲明,聲明子模塊的版本號-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.tellme</groupId>
                <artifactId>mm-web</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>  <dependency>
                <groupId>com.tellme</groupId>
                <artifactId>mm-service</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>  <dependency>
                <groupId>com.tellme</groupId>
                <artifactId>mm-repo</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.tellme</groupId>
                <artifactId>mm-entity</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--公共jar包聲明-->
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons.lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--插件管理-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

需要注意的點:

  1. pom.xml的打包方式:<packaging>pom</packaging>肥矢;
  2. modules標簽包含的是子模塊绩脆;
  3. properties標簽里面是總體參數(shù)配置;
  4. dependencyManagement標簽并不引入依賴橄抹,是總體的依賴聲明靴迫;
  5. dependencies標簽引入依賴,子類共享楼誓;
  6. build插件管理玉锌,需要注意的是daoservice疟羹、entity這三個module并不需要build標簽主守,父pom設置的子類共享。

2. entity模塊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">
    <parent>
        <artifactId>springboot-client</artifactId>
        <groupId>com.tellme</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>mm-entity</artifactId>
</project>

需要注意的點:

  1. parent標簽聲明父標簽榄融;
  2. artifactId聲明子標簽参淫,因為groupIdversion都是繼承了父pom,故可以省略愧杯;
  3. 因為是最底層依賴涎才,故可以不依賴其他子模塊;

3. service模塊的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">
    <parent>
        <artifactId>springboot-client</artifactId>
        <groupId>com.tellme</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>mm-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.tellme</groupId>
            <artifactId>mm-entity</artifactId>
        </dependency>
    </dependencies>
</project>

需要注意的點:

  1. parent標簽聲明父pom力九;
  2. service模塊需要使用entity模塊的數(shù)據(jù)耍铜,故需要dependencies標簽引入entity模塊;
  3. 注意循環(huán)引用問題跌前,即service模塊依賴entity模塊棕兼;entity模塊也依賴service模塊

4. web模塊的pom.xml內(nèi)容

<?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">
    <!--繼承本項目的父工程-->
    <parent>
        <artifactId>springboot-client</artifactId>
        <groupId>com.tellme</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mm-web</artifactId>

    <dependencies>
        <!--依賴service層-->
        <dependency>
            <groupId>com.tellme</groupId>
            <artifactId>mm-service</artifactId>
        </dependency>
        <!--依賴entity層-->
        <dependency>
            <groupId>com.tellme</groupId>
            <artifactId>mm-entity</artifactId>
        </dependency>
    </dependencies>

    <!--多模塊打包-->
    <build>
        <defaultGoal>package</defaultGoal>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- 多模塊項目僅僅需要在啟動類所在的模塊添加打包插件? -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

需要注意的點:

  1. web層需要依賴service層和entity層抵乓,故需將其dependency引入伴挚;
  2. 在多模塊項目中僅僅需要在啟動類所在的模塊添加打包插件靶衍,將其打成可運行的jar。

3. 打包可執(zhí)行jar

打包執(zhí)行步驟
  1. 在每次打包前茎芋,需要clean颅眶。
  2. 雙擊運行package,看到BUILD SUCCESS 就證明打包成功了败徊。
clean成功
package成功

打包的重點是每一個模塊下的pom要配置好,誰需要打包掏缎,誰不需要打包皱蹦,誰依賴誰,父工程是否聲明了子模塊眷蜈,子模塊是否聲明了父工程沪哺。

執(zhí)行jar包

運行jar包

測試成功

執(zhí)行java -jar xxx.jar命令來測試運行打包是否成功。

聚合工程舉一個簡單的例子:
整個工程就好像一個公司酌儒,父工程(退休了什么都不干)只需要聲明有幾個兒子(子模塊)就完事了辜妓。
子模塊web聲明父工程是誰,就當他是大兒子忌怎,公司歸他管籍滴,pom.xml需要打包,需要build配置榴啸,需要其他子模塊的幫助孽惰。
其他模塊聲明父工程是誰,之間關系都是兄弟鸥印,不需要打包勋功,哪里需要就去哪里。

反編譯mm-web.jar

我們可以看到mm-web.jar實際上在lib文件下包含了所有的jar包库说。

4. 需要注意的點

  1. 父pom.xml打包方式狂鞋,jar要更改為pom,build需要更改潜的;
  2. 不需要打包的模塊pom.xml文件不要寫<build>骚揍,全刪掉,例如有些工程的common模塊啰挪,utils模塊都不需要打包疏咐;
  3. 聲明父工程時,填寫父類工程位置<relativePath>../pom.xml</relativePath>
  4. 關于application.properties配置文件脐供,只需要在啟動的模塊中配置就可以了浑塞。
  5. 關于打包為什么打包jar包,不打war包政己,打war包目的是war包可以運行在tomcat下酌壕,但是SpringBoot是內(nèi)置tomcat掏愁,如果你打war包,前提是干掉內(nèi)置的tomcat卵牍,然后才能打包果港,各種麻煩,直接打包可執(zhí)行jar包糊昙,使用java -jar 命令就可以完美的運行起來很方便辛掠!
  6. 真實開發(fā)中使用@Autowired 注解 來實現(xiàn)注入,而不是new對象這種方式释牺,所以可能會產(chǎn)生注入以后報錯萝衩,是因為你的啟動類上沒有配置掃描,使用

@ComponentScan(basePackages = "你的路徑")注解來解決没咙,如果你使用的持久層是Mybatis猩谊,那么你的mapper也需要掃描,在啟動類上使用

@MapperScan("你的mapper文件地址")注解來解決祭刚,算了還是貼個圖片吧
真實開發(fā)中使用@Autowired 注解 來實現(xiàn)注入牌捷,而不是new對象這種方式,所以可能會產(chǎn)生注入以后報錯涡驮,是因為你的啟動類上沒有配置掃描暗甥,使用

@ComponentScan(basePackages = "你的路徑")注解來解決,如果你使用的持久層是Mybatis捉捅,那么你的mapper也需要掃描淋袖,在啟動類上使用

@MapperScan("你的mapper文件地址")注解來解決,算了還是貼個圖片吧

多模塊使用注解開啟全局掃描

4. 聚合和繼承的關系

區(qū)別:

  • 對于聚合模塊來說锯梁,他知道哪些被聚合的模塊即碗,但那些被聚合的模塊不知道這個模塊的存在;

  • 對于繼承關系的父POM來說陌凳,它不知道哪些子模塊繼承了它剥懒,但是子模塊都必須知道自己的父POM是什么。

共同點:

  • 聚合POM與繼承關系的父POM的packaging都是POM合敦。
  • 聚合模塊與繼承關系的父模塊除了POM之外都沒有實際的內(nèi)容初橘。
聚合和繼承

詳細參看:
https://blog.csdn.net/baidu_41885330/article/details/81875395

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市充岛,隨后出現(xiàn)的幾起案子保檐,更是在濱河造成了極大的恐慌,老刑警劉巖崔梗,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夜只,死亡現(xiàn)場離奇詭異,居然都是意外死亡蒜魄,警方通過查閱死者的電腦和手機扔亥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門场躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旅挤,你說我怎么就攤上這事踢关。” “怎么了粘茄?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵签舞,是天一觀的道長。 經(jīng)常有香客問我柒瓣,道長儒搭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任嘹朗,我火速辦了婚禮师妙,結果婚禮上诵肛,老公的妹妹穿的比我還像新娘屹培。我一直安慰自己,他們只是感情好怔檩,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布褪秀。 她就那樣靜靜地躺著,像睡著了一般薛训。 火紅的嫁衣襯著肌膚如雪媒吗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天乙埃,我揣著相機與錄音闸英,去河邊找鬼。 笑死介袜,一個胖子當著我的面吹牛甫何,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遇伞,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼辙喂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸠珠?” 一聲冷哼從身側響起巍耗,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渐排,沒想到半個月后炬太,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡驯耻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年娄琉,在試婚紗的時候發(fā)現(xiàn)自己被綠了次乓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡孽水,死狀恐怖票腰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情女气,我是刑警寧澤杏慰,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站炼鞠,受9級特大地震影響缘滥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜谒主,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一朝扼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎肯,春花似錦擎颖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懂缕,卻和暖如春允跑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搪柑。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工聋丝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人工碾。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓弱睦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親倚喂。 傳聞我的和親對象是個殘疾皇子每篷,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容