最近在做一个功能,需要通过ip获取当前用户所在的城市和和省份,需要读取一个Geolite.mmdb的文件,该文件需要放在工程内部,通过相对路径来加载。折腾了半天才搞定,原因是对classpath不理解,特整理了一些classpath的相关知识,希望能帮助到一些和我一样的新手。
开门见山:classpath是指打包后WEB-INF文件夹下的classes目录。
典型的war包内部结构如下:
webapp.war
|— index.jsp //健康检查文件
|— META-INF //maven自动生成目录
|— WEB-INF //必含
|— web.xml // WAR包的描述文件
|— classes //classpath
|— lib //依赖的jar包
WEB-INF是资源目录,客户端不能直接访问,不过现在的ide编译器在编译时会把src目录下的非java文件移到WEB-INF/classes下面。所以Resource目录下的资源都会被打包到/WEB-INF/classes文件夹下。
classes目录是一个定位资源的入口,里面存放的文件类型大致可以分为几类:
(1)存放项目中src目录下的编译文件;
(2)存放各种资源配置文件:log4j.properties
(3)存放各种模板文件:some.ftl
java中获取类路径的方法,可以通过类加载器:Class.getClassLoader().getResource("").getPath()
例如:放置resources目录下common/GeoLite2-City.mmdb文件,可以通过如下方式获取它的资源路径:
String path = Class.getClassLoader().getResource("").getPath + "common/GeoLite2-City.mmdb"
Spring中引用classpath路径下的文件,只需要在文件名前加上classpath。如:
@PropertySource("classpath:conf/webapp.properties")
网友评论