项目场景:
当我们在项目中定位一个资源时,常常用到相对路径,但相对路径中“./”在项目的迭代不太合适,就需要用到 类加载路径 。
问题描述
每次项目的迭代相对路径都有所改变,我们每次在迭代的同时还要去修改代码中的相对路径,十分的繁琐.
在版本1时:
File file = new File("./V1/src/main/resources/static/index.html");
在版本2时
File file = new File("./V2/src/main/resources/static/index.html");
原因分析:
实际开发中有一个常用的相对路径:类加载路径类加载路径是以当前类作为依据,定位的是当前类所在包最上级包的上一层。
例如:当前类ClientHandler,它所在的包:package com.birdboot.core; 该类所在包的最上级:com 而类加载路径则是com的上级目录:java目录(V2/src/main/java)实际上不是该目录,因为
JVM在执行当前类时,并非执行ClientHandler.java文件而是执行ClientHandler.class文件。
因此类加载路径应当是ClientHandler.class所在包最上级(com)的上级目录在IDEA里,MAVEN项目中所有的代码编译后,会放在target/classes目录中。因此在classes目录中也会包含:com/birdboot/core/ClientHandler.class。所以实际上类加载路径应当是:classes目录由于我们项目中所有的代码编译后都是放在target/classes中,因此定位到classes目录就可以顺着该目录找到项目中所有类。
注意: 在MAVEN项目中有一个要求: src/main下有俩个子目录 java:要求存放所有.java文件和包 resources:存放所有其他类型文件 但是最终编译后,java和resources会合并保存到target/classes下。 因此V5项目编译后,产生target/classes后,会发现该目录下有com目录(所有java代码) 和static目录 因此,定位类加载路径还可以访问到在resources下存放的所有非java文件
解决方案:
使用类加载路径解决
File baseDir = new File(
ClientHandler.class.getClassLoader().getResource(".").toURI()
);
//定位类加载路径下的static目录
File staticDir = new File(baseDir,"static");
//定位static目录中的index.html页面
File file = new File(staticDir,"index.html");