不知道有没有同学遇到这么一种情况,当然这种情况是很早以前的事情的了:
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里头增加如下子节点内容即可,增加后如下:
总结:
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