不知道有沒有同學遇到這麼一種情況,當然這種情況是很早以前的事情的了:
1、基於maven+mybatis搭建一個項目,然後mybatis的mapper的xml放在了src/main/java的目錄下的子目錄,然後打包的時候,發現這些xml文件都不見了。
這種情況是這樣的,maven打包的時候默認打包src/main/java下的class文件,打包src/main/resources下的配置文件。
(上面發現xml不見的契機其實是這樣的:運行項目,報錯,說mapper.java裏頭的方法bind exception,這個錯誤就是xml不存在導致的)
2、如果現在就是1的情況,那麼怎麼把src/main/java下的xml打包到jar包裏頭,怎麼做呢。
這種情況是這樣的,如下往pom文件的bulid節點裏頭增加如下子節點內容:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
3、現在用2的方式處理後,打包,發現確實會把xml打包到jar包裏頭,但是又遇到一個問題,運行項目連啓動都起不來。
以springboot項目爲例子,控制檯直接卡在如下位置幾秒就自動退出了:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.1.RELEASE)
怎麼處理呢?
這種情況是這樣的,檢查jar包,會發現mapper.xml是進去的,但是原先的src/main/resources下面的配置文件全部都丟失了
這種情況只要如下往pom文件的bulid節點裏頭的resources裏頭增加如下子節點內容即可,增加後如下:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
總結:
maven打包,默認會把src/main/resources下面的配置文件打包進來,src/main/java下的java文件編譯打包進來。
一旦配置pom文件裏頭的resources節點,那麼maven打包的時候自動打破默認的撈取配置文件的位置,只撈取我們配置的位置的配置文件
補充resources裏頭的filtering屬性用法:
Filtering
Filtering 是 maven 的 resource 插件 提供的功能,作用是用環境變量、pom文件裏定義的屬性和指定配置文件裏的屬性替換屬性(*.properties)文件裏的佔位符(${jdbc.url}),具體使用如下:
在src/main/resources目錄有個配置文件jdbc.properties,內容如下:
jdbc.url=${pom.jdbc.url}
jdbc.username=${pom.jdbc.username}
jdbc.passworkd=${pom.jdbc.password}
配置 resource 插件,啓用filtering功能並添加屬性到pom:
<project>
...
<!-- 用pom裏定義的屬性做替換 -->
<properties>
<pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url>
<pom.jdbc.username>root</pom.jdbc.username>
<pom.jdbc.password>123456</pom.jdbc.password>
</properties>
<build>
...
<!-- 可以把屬性寫到文件裏,用屬性文件裏定義的屬性做替換 -->
<filters>
<filter>src/main/filters.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
...
</project>
編譯包後target目錄下的jdbc.properties:
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev
jdbc.username=root
jdbc.passworkd=123456