【发布时间】:2018-04-27 17:59:02
【问题描述】:
我正在尝试获取ClassLoader 中的资源。代码的简化版本如下所示:
String ePath = "rewrite/common/RenameFunctor.groovy"
String fPath = ThClType.class.getClassLoader().getResource(ePath);
我作为 fPath 得到的响应是 jar:file:/Users/myName/warPath/warName.war!/WEB-INF/classes!/rewrite/common/RenameFunctor.groovy。我们想要的资源的实际路径正是如此,除了没有第二个感叹号。 (与warName.war不同,classes只是一个普通目录。)
有谁知道可能是什么导致了额外的感叹号和/或可以采取什么措施来解决它?这是更新一些我没有编写的非常旧代码的过程的一部分,因此如果可以对 ClassLoader 行为进行深奥的定制,那么在这种情况下可能已经完成了。如果它是可能的,那么我不知道如何检查,并希望有任何见解。
【问题讨论】:
-
不确定实现细节,但是类路径中资源的“路径”是
/rewrite/common/RenameFunctor.groovy,!-分隔的部分似乎标识了类中条目的路径路径:首先是 WAR/Users/myName/warPath/warName.war,然后是 WAR/WEB-INF/classes。它实际上是添加到类路径中的最后一个条目的内容。 -
@MarkRotteveel 对……但
/WEB-INF/classes实际上并不是一场战争。这就是问题所在。路径应该是jar:file:/Users/myName/warPath/warName.war!/WEB-INF/classes/rewrite/common/RenameFunctor.groovy -
你错过了我的观点。 WAR 本身和
WEB-INF/classes都不在类路径上(而WEB-INF/classes是类路径的一部分)。但是,WEB-INF/classes的 content 位于类路径中。例如使用SomeClass.class.getResourceAsStrean("/rewrite/common/RenameFunctor.groovy")将能够加载该文件的内容,但SomeClass.class.getResourceAsStrean("/WEB-INF/classes/rewrite/common/RenameFunctor.groovy")不会,因为/WEB-INF/classes不在类路径上。看起来 WAR 类加载器通过!分隔路径来表明这一点 -
@MarkRotteveel 好的。我想我明白你在说什么,虽然我不知道在这种情况下如何确认。不幸的是,我正在尝试使用它来填充 GroovyCodeSource,因此“使用流”的答案并不像人们希望的那样有用。我可以为它拼凑一个阅读器,但我认为我无法管理代码库。不过,看起来这至少是部分答案,而且很有帮助,我会邀请您将其写成一个。它确实回答了原始问题中的两个问题之一。
标签: java classloader war