我一直在使用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]
班级结构图片:
答案 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?