ClassLoader.getResources()返回空枚举

时间:2018-06-14 23:52:20

标签: java minecraft

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

找到主要类的包是:" rr.aesir"。我尝试了这个包名称的所有可能性,包括前,后,点,中间的斜杠,并且所有内容都返回了一个空的枚举。 (插头版本: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]

班级结构图片:

Class structure inside project.

2 个答案:

答案 0 :(得分:1)

删除前导/

要编译代码,请在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文件运行的,那当然是行不通的。

答案 1 :(得分:0)

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

根据javadoc

  

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

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

以下问题的解决方案是可以用来列出资源的方法: How do I list the files inside a JAR file?