idea構建maven多module項目


前言

搭建一個項目,看似簡單,但是總會遇到一些奇奇怪怪的問題。

新建parent項目

新建一個springboot項目或者maven項目都可以,這個無所謂。

設置項目的maven倉庫和編碼。

建module

在parent項目下新建多個module,新建springboot項目或者maven項目都可以。

maven項目自己新建包的時候盡量按照groupId + artifactId的方式,如果artifactId是多個中划線連接,則去掉中划線,全小寫拼接。

打包

新建完成上述項目之后,在parent下打包試一下,報錯 “unable to find main class”。

介紹一下maven的packaging標簽:

<packaging>pom</packaging>   --------->   父類型都為pom類型
<packaging>jar</packaging>   --------->   內部調用或者是作服務使用
<packaging>war</packaging>   --------->   需要部署的項目

把packaging 改為pom,大致就是告訴maven,咱只是個外包裝,你不用找什么 main 方法了。

之后繼續打包,發現沒有一個module生成target目錄

介紹一下maven的modules標簽:

<modules>
    <module>moduleA</module>
    <module>moduleB</module>
    <module>moduleC</module>
</modules>

在parent項目的pom中加入modules標簽,包含一下子模塊,告訴maven,這都是我小弟。

子模塊讀取父模塊或其他子模塊的resource文件

首先說一下maven編譯的時候處理相關文件的過程:

構建Maven項目的時候,如果沒有進行特殊的配置,Maven會按照標准的目錄結構查找和處理各種類型文件。

  • src/main/java和src/test/java :
    這兩個目錄中的所有*.java文件會分別在comile和test-comiple階段被編譯,編譯結果分別放到了target/classes和targe/test-classes目錄中,但是這兩個目錄中的其他文件都會被忽略掉。

  • src/main/resouces和src/test/resources
    這兩個目錄中的文件也會分別被復制到target/classes和target/test-classes目錄中。

  • target/classes
    打包插件默認會把這個目錄中的所有內容打入到jar包或者war包中。

此部分參考:https://www.cnblogs.com/pixy/p/4798089.html

了解了maven處理文件的過程,我們說一下maven的resources標簽

resources標簽通常包含在build標簽中;

    <build>
        <resources>
            <resource>
                <directory>../src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

我們只需要配置resource的directory即可將其他模塊的resource文件包含到本模塊中。

maven profile和spring profile整合

其實就是想在application.properties文件中讀取到pom中定義的變量

先說maven profile,引入maven profile主要是為了做環境的分離:

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <!--主要這個標簽名是自定義的-->
                <activeProfile>dev</activeProfile>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <activeProfile>prod</activeProfile>
            </properties>
        </profile>
    </profiles>

在application.properties中指定spring.profiles.active=@activeProfile@

maven編譯的時候指定-P參數:mvn clean package -Pdev

理想情況下,application.properties中會變成spring.profiles.active=dev

但是,理想是豐滿的,現實是骨感的,並沒有成功,查了很多資料,很多人失敗都是倒在了分隔符@@上,但是我並不是。。。

后來發現注釋掉resources標簽打包就可以替換,使用resources標簽就不行,定位到肯定是這兒出的問題。

介紹一下resource標簽下的filtering標簽:
filtering代表開啟過濾,用指定的參數替換directory下的文件中的參數。。。

然后在resource標簽中加入filtering標簽,設置為true就可以了

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

就這,啥也不是。。。


免責聲明!

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



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