gradle复制xml等配置文件到输出目录
用gradle开发spring boot + mybatis项目时,我们需要把xml等配置文件复制到输出目录和jar包中,可是……有时候总会出现一些奇怪的问题……希望本文可以解决你的问题,也可以解决你的疑惑。
问题场景
项目中在src/main/java目录中放置了xml或其他配置文件,我需要把它复制到jar包中,并可以在ide中调试运行
解决方法
把文件复制到jar包中
复制文件到jar包中,可以采用如下代码(build.gradle)文件中:
apply plugin: 'java'
jar {
from('src/main/java'){
include '**/*.xml'
}
}
有了上面所示的jar配置,就可以把源代码目录下面所有的*.xml复制到jar包中。
万事大吉,对不!不!事情没有那么简单!
此时查看build/libs目录下的jar包时,配置文件乖乖的在jar包中等着呢!
是的,可是,如果你想在开发环境中运行时,你会发现,如果你的程序依赖于这些*.xml文件,那么程序无法运行。
如果,你刚好和我一样,运行的是集成mybatis的程序,对不起,会出错,而且提示的bean无法实例化,为啥?其实这个时候,使用java -jar build/libs/*.jar是可以运行程序的!
上面的代码就是解决了生存jar包时xml配置文件复制的问题,可是没有解决开发环境调试的问题。
把文件复制到resources目录下
一种办法,就是把所有xml文件复制到src/main/resources目录下,如果一定要反正src/main/java目录下,还需要下面的配置脚本才可以:
sourceSets {
main {
resources {
//可以将java目录下的所有非.java资源打包到classes下
srcDir 'src/main/java'
}
}
}
这样,resources目录下的文件也会复制到build/resource目录下,而且,不需要前面的jar中的from配置,jar包中也会存在配置文件。这里可以理解为jar过程是在源码复制结束后执行的(gradle的确是有这个的依赖关系的,请看这里:gradle java插件文档)。
这里需要提醒的是,如果采用srcDirs的写法,那么,请注意需要如下写,否则,你会发现本应该复制的配置文件确没有复制了:
sourceSets {
main {
resources {
//可以将java目录下的所有非.java资源打包到classes下
srcDirs = ['src/main/java', 'src/main/resources']
}
}
}
为什么呢?因为sourceSets的作用就是解决源代码目录结构的配置项,比如,配置文件的目录不是src/main/resources目录,而是src/resources目录(少来main目录),那么就需要通过上面的方法修改,替换默认的配置文件位置。当然,也可以通过如下方式修改源代码目录的位置:
sourceSets {
main {
java{
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}