前言
搭建一個項目,看似簡單,但是總會遇到一些奇奇怪怪的問題。
新建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>
就這,啥也不是。。。