繁体   English   中英

ClassLoader.getResources()返回空枚举

[英]ClassLoader.getResources() returns empty enumeration

我一直在使用ClassLoader类的getResources()函数在我在Minecraft中编码的某个插件中加载类。

找到主类的包是:“ rr.aesir”。 我在此包名称之前,之后,点之间,之间用斜杠尝试了所有可能的情况,并且所有内容均返回空Enumeration。 (Spigot版本:1.12.1)。 也尝试从其他类中调用它。

ClassLoader loader = this.getClass().getClassLoader();
Enumeration<URL> urls = this.loader.getResources("/rr/aesir");
String path = urls.nextElement().getPath();

这段代码放在扩展JavaPlugin的主类中。 我收到一个错误消息,说NoSuchElementException。 我没有在类中的任何地方调用nextElement(),所以不是我跳过了任何现有的元素。

我没有选择,任何帮助都可以接受。

完整的堆栈跟踪:

[03:07:43 INFO]: [Aesir] Enabling Aesir v1.0
[03:07:43 INFO]: [Aesir] Aesir has been enabled.
[03:07:43 ERROR]: Error occurred while enabling Aesir v1.0 (Is it up to date?)
java.util.NoSuchElementException: null
        at sun.misc.CompoundEnumeration.nextElement(Unknown Source) ~[?:1.8.0_151]
        at rr.aesir.Aesir.load(Aesir.java:72) ~[?:?]
        at rr.aesir.Aesir.onEnable(Aesir.java:47) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:402) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:384) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:333) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.reload(CraftServer.java:755) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.Bukkit.reload(Bukkit.java:525) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:651) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:637) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:444) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:407) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.1.jar:git-Spigot-da42974-8f47214]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]

类结构图:

项目内部的类结构。

删除前导/

要编译代码,也请删除this. loader之前。

ClassLoader loader = this.getClass().getClassLoader();
Enumeration<URL> urls = loader.getResources("rr/aesir");
String path = urls.nextElement().getPath();

请注意, getPath()可能不会返回您认为会返回的字符串。

url.toString()返回类似file:/C:/foo/bar/rr/aesir
url.getPath()返回/C:/foo/bar/rr/aesir

如果需要实际路径,请调用Paths.get(url.toURI()).toString()
返回C:\\foo\\bar\\rr\\aesir

如果您是Java 7之前的用户,请调用new File(url.toURI()).toString()
如果您的代码是从jar文件运行的,那当然是行不通的。

我想假设您要列出rr/aesir目录中的所有资源,您对getResources确切功能有点误解。

根据javadoc

查找具有给定名称的所有资源。 资源是某些数据(图像,音频,文本等),可由类代码以与代码位置无关的方式进行访问。

可以有多个具有特定名称的资源,这就是为什么它返回一个枚举的原因。 并且不在目录中列出资源。

以下问题的解决方案是可以用来列出资源的方法: 如何列出JAR文件中的文件?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM