不知道有没有同学遇到这么一种情况,当然这种情况是很早以前的事情的了:

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