无法在所有计算机上访问JAR中的资源

Mic*_*ith 6 java file-io resources jar

我正在编写一个应用程序(特别是Bukkit Minecraft服务器的插件).这样做需要我从应用程序的JAR访问.properties文件.这是我遇到一个奇怪问题的地方.当我在我的开发PC上测试程序时,它运行得很好..properties文件被加载,一切都很好.但是,在我测试它的另一台计算机上,我尝试启动应用程序,它无法加载属性,而且InputStreamnull.这是我加载文件的方法:

public class Points {
    private HashMap<String, MessageFormat> messages;

    public Points() {
         buildMessages();
    }

public static void buildMessages() {
        Properties messageProps = new Properties();
        InputStream in = Points.class.getResourceAsStream("resources/messages.properties");
        messages = new HashMap<String, MessageFormat>();
        Enumeration en;
        try {
            messageProps.load(in);
        } catch(IOException ex) {
            System.err.println("Couldn't read message properties file!");
            return;
        } catch(NullPointerException ex) {
            System.err.println("Couldn't read message properties file!");
            if(in == null)
                System.out.println("IOStream null");
            return;
        }
        en = messageProps.propertyNames();
        while(en.hasMoreElements()) {
            String key = (String)en.nextElement();
            String prop = messageProps.getProperty(key);
            MessageFormat form = new MessageFormat(prop.replaceAll("&", 
                "\u00a7").replaceAll("`", ""));
            messages.put(key, form);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我省略了一些不相关的代码,但这就是它的要点.JAR的结构如下:

   com/
       pvminecraft/
           points/
               Points.java <-- The class where the file is loaded
               resources/
                   messages.properties <-- The file being loaded
Run Code Online (Sandbox Code Playgroud)

在我的电脑上,文件是从中加载的resources/messages.properties,但在另一个文件中,它InputStream是null,而我的catchNullPointerException是运行的.可能导致问题的原因是什么,我该如何解决?谢谢.

更新:即使使用完整路径(/com/pvminecraft/points/resources/messages.properties),同样的问题仍然存在.

更新2:这是完整的堆栈跟踪:

java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Properties.java:435)
    at java.util.Properties.load0(Properties.java:354)
    at java.util.Properties.load(Properties.java:342)
    at com.pvminecraft.points.Points.buildMessages(Unknown Source)
    at com.pvminecraft.points.Points.onEnable(Unknown Source)
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:188)
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:968)
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:280)
    at org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:186)
    at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:169)
    at org.bukkit.craftbukkit.CraftServer.reload(CraftServer.java:436)
    at org.bukkit.Bukkit.reload(Bukkit.java:187)
    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:22)
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:165)
    at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:378)
    at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:374)
    at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:564)
    at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:541)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:425)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:457)
Run Code Online (Sandbox Code Playgroud)

所有的org.bukkitorg.craftbukkit东西是服务器..properties文件加载在buildMessages方法中,由onEnable方法调用Points.

更新3:在全新安装的Arch Linux上,正确加载了消息属性文件,一切正常.远程服务器是Ubuntu Linux,我的开发PC是Arch.

更新4:好的,这是一种解决方案.这似乎是一个局部问题.我这样说是因为我设法访问了另外两台计算机,并且程序在两者上运行正常.虽然这很烦人,但我的代码或构建脚本似乎没有任何问题.我仍然想知道什么是错的,但它不再紧迫了.我会继续研究这个.感谢大家.

Tom*_*Tom 2

不同 Java 类加载器及其搜索路径之间似乎存在细微差别。在讨论这些细节之前;为什么不尝试这个 jar 文件中的完整路径呢?(即像这样:

Points.class.getResourceAsStream("com/pvminecraft/points/resources/messages.properties");
Run Code Online (Sandbox Code Playgroud)