Maven设置:非resources文件夹下配置文件也拷贝到target对应目录的注意事项

首先来一段maven中的资源插件:

 1 <build>
 2     <resources>
 3     <resource>
 4     <directory>src/main/java</directory><!--所在的目录-->
 5     <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
 6     <include>**/*.properties</include>
 7     <include>**/*.xml</include>
 8     </includes>
 9     <!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
10     <filtering>false</filtering>
11     </resource>
12     </resources>
13   </build>

学过maven的都知道,默认没有配置<resources>的时候,maven执行编译代码时,会默认把:src/main/resources目录中的所有文件拷贝到target/classes目录中。

但在实际开发中,有时候配置文件不全放在resources文件夹中,所以这时候需要maven在compile阶段的时候,将非resources文件夹中的文件也拷贝到target/classes对应的目录中去,该如何设置呢?

答案就是往maven的pom文件中添加资源插件,代码如上所示。

上面的代码的作用就是将:src/main/java目录下的任何子目录中的以:properties或xml结尾的文件,都拷贝到target/classes所对应的目录下去。

如下是添加如上代码后,执行compile后的target/classes目录:

 如图片中所标识的,为什么加了上面的资源设置后,虽然Java目录下的设置文件能够被拷贝到对应的目录中去,但resources文件夹下的文件却在target/classes目录下找不到?

其实,如果你设置了指定某个文件夹下的某种类型文件要拷贝到target/classes对应的目录中的话,那么原来默认的只拷贝:resources目录下的所有文件到target/classes的这一行为也会被取消,也就是maven这一默认行为没了~~~

这种方式跟一个类中的构造方法挺像的:如果你没写构造方法,那么默认会给你提供一个无参的构造方法,但是如果你自己定义了构造方法,那么也就不会给你提供默认的构造方法了。

所以,如果你也想resources中的文件被拷贝到target/classes目录下,那么在build中再添加一个资源插件就好了,如下所示:

 1 <resource>
 2         <!--这里要注意,如果设置了处理设置,原先resources目录下的文件都不会拷贝到target目录下了,所以这里还要再设置一下resources目录,以便能拷贝过去-->
 3         <directory>src/main/resources</directory>
 4         <includes>
 5           <!--表示resources下的任何子目录的任何文件都拷贝过去-->
 6           <include>**/*.*</include>
 7         </includes>
 8         <filtering>false</filtering>
 9       </resource>
10     </resources>

*.*表示的是匹配所有类型的文件。添加完毕后,再次执行compile后,可以看到resources文件夹中的文件也被拷贝到了:target/classes目录下

因此当idea用maven设置非resources文件夹的问价拷贝的时候,如果想要也拷贝resources文件夹的文件,记得要再加一个资源配置到pom文件中;就好比如你自己定义了一个有参的构造方法,但是还想要无参的构造方法,还是要自己手动写一个无参的构造方法,因为你一定义了构造方法,jvm就不会再为你提供无参的构造方法了。

另外还要注意:pom是xml文件,xml文件是区分大小写的,xml与XML是不同的类型文件,配置的时候记得要小写。

很多人利用maven进行测试的时候,会报:找不到junit测试包,找不到Test类等,首先考虑这个jar包下载是否成功,可以到本机仓库查看一下对应版本的junit的jar包是否存在,如果存在还是报错,建议删除jar包,再重新下载一次;如果还是不行,考虑一下版本的问题,可能是maven的版本过高而你使用的idea版本过低导致的。我就是遇到了版本的问题,我使用的idea版本是2018.3的,而我使用的Maven版本是3.6.3的,后来将maven版本改为3.3.9的就好了。

其实版本冲突的问题,是可以避免的,因为idea内置了maven工具,如图所示:内置了两个maven的版本,一个是2一个是3

(idea的file>settings 设置的修改仅仅对于当前的工程生效;file>othersettings 设置的修改对以后所有的工程或者模块生效)

 我们选择idea内置的maven工具就可以了,不必自己下载,因为还会造成下载的maven版本和idea版本不支持的问题,但是存放jar文件的地址可以改下:

 选择对应的settings.xml文件目录,这里我修改了存放的位置为:E盘下,这样就没问题了。

选择idea内置的maven的优缺点:

优点:

  • 不会有maven和idea版本冲突问题,使用方便

缺点:

  • maven和idea高度耦合,如果用其他开发工具例如:eclipse 可能无法使用使用maven
  • 不可以指定使用maven的版本,灵活性比较低
  • idea升级的时候,也会更新maven,可能带来一些意想不到的问题

idea使用maven还有一点需要注意:

maven中,(指的是不指定拷贝某个文件下的文件到target目录下的前提下)默认将名为这个文件夹下的所有文件拷贝到target目录下,
如果不叫这个名字就不会拷贝,在idea中就算你已经定义了某一个文件夹为资源文件夹,但是如果不叫resources这个名字的话,还是不会拷贝!


资源文件夹的图标就是这个,定义资源文件夹的目的就是告诉idea这是专门用来放配置文件的文件夹,指定资源文件夹也算是web工程在maven中的一种约定吧,但是不指定可以吗?可以,但是名字必须叫这个名字。


 
原文地址:https://www.cnblogs.com/ljfsmile0613/p/13336687.html