首先用Eclipse创建一个简单的Maven工程,如图:
对于eclipse来说 src/main/java 和 src/mian/resources 都是属于classpath,也就是项目的根路径。
src/main/resources : 只允许存放配置如.xml .properties等的配置文件,不支持编译(运行).java文件(你想放也可以,没意义)。也就是说在src/main/resources目录下是不能编译和运行.java文件的
src/main/java:支持存放和运行.java文件,也支持存放其他配置文件。
把项目进行编译(eclipse保存自动编译),进入工作空间查看项目下的target目录(编译后.class文件和配置文件的存放目录,也就是程序真正运行使用的目录),这个时候会发现,eclipse把src/main/java 和 src/mian/resources目录下的所有.java文件都编译成.class文件存放于classes的目录下,同时src/main/java 和 src/mian/resources中的配置文件也会按照包结构存放于classes中。也就是说,不管你的配置文件是放在src/main/java 还是 src/mian/resources目录,编译后都结果都会讲将配置文件加载到classes中。
演示一下:
项目结构:将三个properties配置文件test1,test2,test3分别放于/src/main/java/com/lic/test,/src/mian/java,/src/main/resources这三个目录下。
将项目进行编译,查看工作空间中项目下的target目录:
test-classes属于/src/test/java和/src/test/resources的,这里不做阐述,我们查看classes文件夹
可以得出我上面阐述的结论,不管你的配置文件是放在src/main/java 还是 src/mian/resources目录,编译后都结果都会讲将配置文件加载到classes中。
代码中分别来加载这些配置文件:
public class Test {
public static void main(String[] args) {
// 加载与Test.java同级的配置文件,才用相对路径加载
InputStream inputStream = Test.class.getResourceAsStream("test1.properties");
System.out.println(inputStream);
// 加载位于src/mian/java(classpath)目录下的配置文件,使用classLoader加载器
inputStream = Test.class.getClassLoader().getResourceAsStream("test2.properties");
System.out.println(inputStream);
// 加载位于src/main/resources目录下的文件,因为对于eclipse来这说也是classpath,使用classLoader加载器
inputStream = Test.class.getClassLoader().getResourceAsStream("test3.properties");
System.out.println(inputStream);
}
}
输出结果:
java.io.BufferedInputStream@15db9742
java.io.BufferedInputStream@6d06d69c
java.io.BufferedInputStream@7852e922
证明三个配置文件都被加载到了,且运行时加载的路径确实位于classes下
首页用idea创建一个简单的maven工程,如图:
可以看出在结构上看上去与eclipse差不多,毕竟都属于maven的规范,但还是有一定区别的。
idea将src/main/java定义为.java的文件目录而src/main/resources定义为资源文件目录(存放配置文件的地方)。
idea并没有把src/main/java和src/main/resources都当做classpath来处理,所以当编译项目的时候,位于src/main/java中的.java文件会被编译成.class文件存入于target下的classes目录中,而里面的配置文件并不会被拷贝到target下的classes目录中(这是跟eclipse最大的不同)。所以只有在/src/mian/resources目录下的配置文件在编译后才会拷贝到target下的classes目录中。即idea无法在代码中直接运行/src/mian/java中的配置文件
演示一下:
项目结构:将三个properties配置文件test1,test2,test3分别放于/src/main/java/com/lic/test,/src/mian/java,/src/main/resources这三个目录下。
将项目进行编译,查看编译后的工作目录下的target/classes文件
可以看出,位于src/main/java/下的test2.properties以及test1.properties都不存在于classes目录下,也就是说存放于src/main/java/目录下配置文件在编译器不会被加载到classes中,即不能在运行时去加载该路径下的配置文件,而应当把配置文件放入到/src/main/resources下,因为很明显test3.properties已被加载到classes目录中。
代码中分别来加载这些配置文件
public class Test {
public static void main(String[] args) {
// 加载与Test.java同级的配置文件,才用相对路径加载
InputStream inputStream = Test.class.getResourceAsStream("test1.properties");
System.out.println(inputStream);
// 加载位于src/mian/java(classpath)目录下的配置文件,使用classLoader加载器
inputStream = Test.class.getClassLoader().getResourceAsStream("test2.properties");
System.out.println(inputStream);
// 加载位于src/main/resources目录下的文件,因为对于eclipse来这说也是classpath,使用classLoader加载器
inputStream = Test.class.getClassLoader().getResourceAsStream("test3.properties");
System.out.println(inputStream);
}
}
输出结果为:
null
null
java.io.BufferedInputStream@4554617c
可以看出,在idea中是无法加载位于src/main/java中的配置文件的,而只能将配置文件放于src/main/resourse目下才能被代码访问。但在eclipse中,无论你将配置文件放在src/main/java还是src/main/resources下,eclipse都把它当成classpath路径,编译的时候会把classpath下的文件都被加载到classes目录下。因此eclipse可以在运行时访问src/main/java中的配置文件,而idea不行