Я пишу приложение (в частности, плагин для сервера Bukkit Minecraft). Для этого необходимо получить доступ к файлу .properties из JAR приложения. Здесь я столкнулся со странной проблемой. Когда я тестирую программу на своем компьютере для разработки, она работает нормально. Файл .properties загружается, и все в порядке. Однако на другом компьютере, на котором я его тестирую, я пытаюсь запустить приложение, но оно не может загрузить свойства, и InputStream
имеет значение null
. Вот метод, которым я загружаю файл:
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);
}
}
}
Я пропустил некоторый нерелевантный код, но это его суть. Структура JAR следующая:
com/
pvminecraft/
points/
Points.java <-- The class where the file is loaded
resources/
messages.properties <-- The file being loaded
На моем ПК файл загружается из resources / messages.properties
, но в другом файле InputStream
имеет значение null, и Мой блок catch
для NullPointerException
запущен. Что могло быть причиной проблемы и как ее исправить? Спасибо.
Обновление: Даже при использовании полного пути ( /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)
Все материалы org.bukkit
и org.craftbukkit
являются сервером. Файл.Файл свойств загружается в метод buildMessages
, вызываемый методом onEnable
для Points
.
Обновление 3: При новой установке Arch Linux файл свойств сообщения загружается правильно, и все в порядке. Удаленный сервер - это Ubuntu Linux, а мой компьютер разработчика - Arch.
Обновление 4: Хорошо, это своего рода разрешение. Вроде проблема локальная. Я говорю это потому, что мне удалось получить доступ еще к двум компьютерам, и программа корректно работает на обоих. Хотя это и раздражает, похоже, что с моим кодом или скриптами сборки ничего плохого нет. Я все еще хочу знать, что не так, но это больше не актуально. Я продолжу изучать это. Спасибо всем.