我正在尝试从jar文件中读取包名。我的探索是,当我获得URL时,它包含无法识别的表单,以便被Windows文件识别。
我读了这个解决方案。但这对我没有帮助。 Convert URL to normal windows filename Java
directoryURL.toURI().getSchemeSpecificPart()
不会转换Windows样式。
这是我的代码。
// Get a File object for the package
URL directoryURL = Thread.currentThread().getContextClassLoader()
.getResource(packageNameSlashed);
logger.info("URI" + directoryURL.toURI());
logger.info("Windows file Name" + directoryURL.toURI().getSchemeSpecificPart());
// build jar file name, then loop through zipped entries
jarFileName = URLDecoder.decode(directoryURL.getFile(), "UTF-8");
jarFileName = jarFileName.substring(0, jarFileName.indexOf(".jar"));
// HERE Throws exception"
jf = new JarFile(jarFileName + ".jar");
while (jarEntries.hasMoreElements()) {
entryName = jarEntries.nextElement().getName();
logger.info("Entry name: " + entryName);
if (entryName.startsWith(packageNameSlashed)
&& entryName.length() > packageNameSlashed.length() + 5
&& entryName.endsWith(".class")) {
entryName = entryName.substring(packageNameSlashed.length() + 1);
packageClassNames.put(entryName, packageName);
}
}
这是日志。
16-02-2015 14:02:15 INFO - URI jar:file:/C:/SVN/AAA/trunk/aaa/client/target/server-1.0.jar!/packageName
16-02-2015 14:02:15 INFO Windows file Name file:/C:/SVN/AAA/trunk/aaa/client/target/server-1.0.jar!/packageName
答案 0 :(得分:1)
“jar:...”URL无法识别文件。相反,它标识了JAR文件的成员。
语法是(粗略地说)"jar:<jar-url>!<path-within-jar>"
,其中它本身就是一个URL;例如示例中的“file:”URL。
如果要打开JAR文件并迭代这样的条目,则需要:
提取原始网址的schemeSpecificPart
将schemeSpecificPart拆分为“!”字符。
在“!”之前解析部分作为URI,然后使用File(URI)
获取File
。
使用File
打开ZipFile
。
在“!”之后查找部分在ZipFile
...
答案 1 :(得分:1)
斯蒂芬的答案包含了你需要的所有元素。
我不确定这是否是实现目标的最佳方式,我会检查类发现(这是你想要做的,是如何在一些开源框架中实现的(例如tomcat使用它,JPA inslementation)找到权利)。还有关于apache的发现项目,但它似乎已经死了一段时间。