【问题标题】:ClassLoader.getResources() returns empty enumerationClassLoader.getResources() 返回空枚举
【发布时间】:2018-06-14 23:52:20
【问题描述】:

我一直在使用 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.

【问题讨论】:

  • 你运行的是什么操作系统?
  • @JacobG.我正在运行 Windows 10。
  • 这解决了一个问题。调试后你必须咨询 Bukkit/Spigot 论坛。
  • 显示你的jar文件的结构;验证资源实际上是在给定的路径。

标签: java minecraft


【解决方案1】:

删除前导/

要编译代码,还要在loader之前删除this.

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 文件运行的,那当然不会起作用。

【讨论】:

  • 它仍然无法正常工作,返回相同的错误并给出相同的结果。
【解决方案2】:

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

根据javadoc

查找具有给定名称的所有资源。资源是可以通过类代码以独立于代码位置的方式访问的一些数据(图像、音频、文本等)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2018-11-17
    • 2012-11-27
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多