今天執行mvn package
打包專案時,進行test階段時出現org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
錯誤。
在Eclipse中直接執行JUnit是正常的,MyBatis配置一切正常,但就是在打包測試階段就會報錯。
原因在Eclipse中若把XML Mapper的xml
文件放到Source Folder(src/main/java
)中,在Eclipse編譯時會一起放入classes
目錄所以不會出錯;但Maven編譯的時候不會將src/main/java
中的靜態文件放入classes
,所以導致XML Mapper找不到而報錯。必須將XML Mapper放在src/main/resources
下靜態文件才會被放入classes。
若仍要將XML Mapper放在src/main/java
下,解決方法是在pom.xml
中使用Maven Resources Plugin的<resources>
指定建置時要加入的資源(resources)。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<!-- 指定src/main/resources -->
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- 指定src/main/java下的idv.matt.mapper pakcage中的所有xml建置時都要放入classes-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>idv/matt/mapper/*.xml</include>
</includes>
</resource>
</resources>
</build>
設定完以上後Maven編譯時就會把src/main/java
中的XML Mapper放在classes
,在test的時候就不會出現找不到Mapper的問題。
未設定<resources>
前,預設會讀取src/main/resources
的資源;然而一旦設定<resources>
,則此預設行為就會消失,所以除了指定的XML Mapper的路徑外,也必須把src/main/resources
設定在<resources>
中。
另一個解決方法是只要把XML Mapper檔中的內容稍為更動一下存檔後就解決了,真是太神奇了傑克。
參考:
沒有留言:
張貼留言