Windows 10下Java类路径开头出现斜杠(/)的原因、解决方法及JarFile文件找不到异常处理
问题分析与解决方案
一、路径开头出现斜杠的原因
这是因为CodeSource.getLocation()返回的是URL格式的路径,在Windows系统中,URL会将盘符表示为file:/C:/...这种形式。当你调用getPath()方法时,会直接提取URL的路径部分,自然就带上了开头的斜杠——这是URL的标准格式要求,和Windows本地文件路径的格式差异导致的。
二、修复多余斜杠的几种方法
推荐优先使用跨平台的方式,避免手动字符串处理带来的兼容性问题:
借助
File类自动适配路径
通过URL转成File对象,File会自动处理Windows系统的路径格式,去掉多余的开头斜杠:CodeSource codeSource = DeviceManager.class.getProtectionDomain().getCodeSource(); if (codeSource != null) { File locationFile = new File(codeSource.getLocation().toURI()); String correctPath = locationFile.getPath(); // 此时correctPath就是标准的Windows路径,比如C:\Users\gdiaz\repos\devicetalk\build\classes\main\ }使用Java 7+的
Paths类
和File类类似,Paths也能自动适配系统路径规则:CodeSource codeSource = DeviceManager.class.getProtectionDomain().getCodeSource(); if (codeSource != null) { Path path = Paths.get(codeSource.getLocation().toURI()); String correctPath = path.toString(); }手动截取斜杠(仅适合Windows场景)
如果只针对Windows环境,也可以手动判断并移除开头的斜杠,但这种方式不推荐跨平台使用:String rawPath = DeviceManager.class.getProtectionDomain().getCodeSource().getLocation().getPath(); String correctPath = rawPath; if (rawPath.startsWith("/") && rawPath.length() > 1 && rawPath.charAt(1) == ':') { correctPath = rawPath.substring(1); }
三、关于JarFile触发FileNotFoundException的额外说明
你遇到的这个异常,其实不完全是开头斜杠的问题——更核心的原因是:你传入的路径是一个目录(build/classes/main是编译后的class文件目录),而JarFile的构造方法要求传入的是Jar文件的路径,不是目录。
如果你的DeviceManager类是在本地开发环境的class目录中运行(而非打包成Jar),那getLocation()返回的就是目录路径,这时候用JarFile去打开目录肯定会报错。你需要根据实际场景调整:
- 如果要读取目录下的class文件,直接用
File或Files类操作目录即可; - 如果确实需要操作Jar文件,确保你的类是打包在Jar中运行的,此时
getLocation()会返回Jar文件的路径,再传入JarFile就正常了。
内容的提问来源于stack exchange,提问作者Aikanáro
相关产品推荐
相关产品推荐

