在开发当中,我们一般打包都是利用maven打包的,在项目当中我们经常会看见resources标签,可能很多人对这个标签并不是很理解,本篇文章主要详细记录resources标签的用法。
可能写的比较多,但是都是我亲自做实验,边做实验边记录的。看完相信你肯定能理解的。
目录
- 一、resources作用
- 1、打包编译作用
- 2、配置文件取pom当中的值
- 二、演示resources打包编译的作用
- 1、创建springboot项目
- 2、进行编译打包
- 3、出现问题
- 4、得出结论
- 5、添加resources进行解决
- 三、演示application取pom当中值
- 1、创建springboot项目
- 2、进行编译打包
- 3、得出结论
- 4、添加resources进行解决
- 5、疑问
一、resources作用
1、打包编译作用
在项目当中进行编译的时候,他默认是不会对某些文件进行编译的,例如在java文件夹下的mybatis当中的.xml文件,还有在resources文件夹当中有时候会存储一些资源文件,默认有些也是不进行编译的,这里的不进行编译指的是他不会编译到target文件夹当中,并且打包也是。
我们在正常开发项目的时候,有时候获取资源是获取的编译后的路径地址,他会在编译后的路径找不到文件(target文件夹),就是这个原因。
这时候就需要用到resources标签,在pom.xml添加,告诉maven我这些文件也需要编译,并且打包的时候需要打包进去。
2、配置文件取pom当中的值
在现实开发当中,我也遇到过,在pom文件当中配置参数,然后通过application.properties使用@@来进行取pom的值。假如我不想用application.properties取值,而是用了新创建的比如a.properties取值,这时候就需要在pom当中配置resources。
下面经过示例直接演示。
二、演示resources打包编译的作用
1、创建springboot项目
这里我创建了个空项目,然后resources当中加了很多空文件,java当中也是加了一个文件,pom.xml我是没有动的,现在开始编译打包测试。
看看哪些文件在编译过后,会丢失。
2、进行编译打包
mvn clean install 一下:
这个是编译后的,可以看出来在java文件夹当中,我添加了a.fxml文件,但是编译过后却丢了。(注意:这里的fxml文件只是演示,总之不是java文件,也可能xml等文件
)
3、出现问题
这里我打的jar包,将包解压之后发现和target当中的classes一模一样。同样是缺少那个a.fxml文件。
4、得出结论
1、假如pom.xml不加resources,编译出来的会丢失文件,这也就是很多情况下,我们在本地电脑运行没有问题,但是一旦打包到服务器,会发现项目根本跑不起来,缺少各种文件,有时候就是这个原因。
2、target当中的classes和打出来的包解压后的classes是一模一样的。
5、添加resources进行解决
这里的配置代表的是,我要将src/main/java路径下.fxml文件结尾的,编译打包进去。
当有两个同类型文件,只想打包进去一个文件,可以在include标签当中指定文件名称。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<includes>
<include>**/*.fxml</include>
</includes>
</resource>
</resources>
</build>
添加这个配置之后,再进行编译打包,会发现以下问题:
view当中的文件打包进来了,但是resources文件下的文件夹和文件全丢了。
解决:
告诉maven,resources文件下的全部要进行编译。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<includes>
<include>**/*.fxml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
从这里可以看出来,现在我项目当中的文件都打包进来了。
三、演示application取pom当中值
1、创建springboot项目
pom配置文件我添加了一个port设置。
<properties>
<java.version>1.8</java.version>
<port>8081</port>
</properties>
项目里面我添加了一个a.properties文件。a.properties和application.properties当中我都设置了:
server.port=@port@
目的:就是让配置文件的port去读pom.xml当中设置的port值。
2、进行编译打包
编译打包后会发现,a.properties没有变化,而application.properties却变成了maven当中设置的值。
3、得出结论
我这里用的是springboot2.6.2,不管是哪个版本都可以点进去,我们点进去观察。
从这里可以看出,springboot依赖当中,其实已经将application.properties给配置了。
也就是a.properties没有进行配置,所以取不到值,而application.properties配置了,所以取到值了。
4、添加resources进行解决
目前问题是假如我想让a.properties也一样可以取到值。
通过添加以下配置即可:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
注意:
这里的filtering一定要设置为true
,假如为false,我们配置文件当中用到了@@取pom的值,会取不到。
实际上,他是在编译过后就把application当中的值给替换了,替换成了pom当中配置的值,而并非是程序当中获取的时候,他才动态去获取pom当中的值。
5、疑问
可能有的人会感觉好奇,为什么不这么配置,其实我也试了,只不过这么加的话,resources当中的文件就丢了,只剩下a.properties了。
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>a.properties</include>
</includes>
</resource>
</resources>
总结:一旦pom当中添加resources,指定某一个文件,就会导致resources其他文件打包的时候丢失,这两个例子其实都 体现 出来了。