Idea与Eclipse项目结构的区别以及加载配置文件的方式

1.Eclipse的项目结构与加载配置文件的方式
首先用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下

2.Idea项目结构和加载配置文件的方式
首页用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不行
--------------------- 
作者:Li_Chong- 
来源:CSDN 
原文:https://blog.csdn.net/weixin_40929150/article/details/81476368 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/bingguang1993/article/details/84792356