Tôi đang viết một ứng dụng (cụ thể là một plugin cho máy chủ Minecraft Bukkit). Làm điều này yêu cầu tôi truy cập tệp .properties từ JAR của ứng dụng. Đây là nơi tôi gặp phải một vấn đề lạ. Khi tôi kiểm tra chương trình trên PC phát triển của tôi, nó chạy tốt. Tệp .properties được tải và mọi thứ đều ổn. Tuy nhiên, trên máy tính khác mà tôi thử nghiệm trên, tôi cố gắng khởi động ứng dụng và không thể tải các thuộc tính và InputStream
là null
. Dưới đây là phương pháp trong đó tôi tải các file:Không thể truy cập tài nguyên trong một JAR trên tất cả các máy tính
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);
}
}
}
tôi đã bỏ qua một số mã không liên quan, nhưng đó là ý chính của nó. Cấu trúc của JAR là như sau:
com/
pvminecraft/
points/
Points.java <-- The class where the file is loaded
resources/
messages.properties <-- The file being loaded
Trên PC của tôi tập tin được tải từ resources/messages.properties
, nhưng vào file khác, InputStream
là null, và catch
khối của tôi cho NullPointerException
được chạy. Điều gì có thể gây ra sự cố và làm cách nào để khắc phục sự cố? Cảm ơn.
Cập nhật: Ngay cả khi sử dụng đường dẫn đầy đủ (/com/pvminecraft/points/resources/messages.properties
), vấn đề tương tự vẫn còn dai dẳng.
Cập nhật 2: Đây là full stack trace:
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)
Tất cả những thứ org.bukkit
và org.craftbukkit
là máy chủ. Tệp .properties được tải theo phương thức buildMessages
, được gọi theo phương thức onEnable
của Points
.
Cập nhật 3: Trên bản cài đặt mới của Arch Linux, tệp thuộc tính thư được tải chính xác và tất cả đều tốt. Máy chủ từ xa là Ubuntu Linux và máy tính cá nhân của tôi là Arch.
Cập nhật 4: Được rồi, đây là loại phân giải. Nó có vẻ là một vấn đề địa phương hóa. Tôi nói rằng vì tôi đã quản lý để có được quyền truy cập vào hai máy tính khác, và chương trình chạy một cách chính xác trên cả hai. Trong khi nó gây phiền nhiễu, điều này không có vẻ là bất cứ điều gì sai trái với mã của tôi hoặc xây dựng kịch bản. Tôi vẫn muốn biết có gì sai, nhưng nó không phải là bức xúc nữa. Tôi sẽ tiếp tục xem xét điều này. Cảm ơn mọi người.
Thư mục "tài nguyên" không nằm trên đường dẫn lớp - xem câu trả lời của Tom. Tuy nhiên, thư mục "com/pvminecraft/points/resources" là. Kiểm tra môi trường phát triển của bạn - Tôi tin rằng bạn đã có hoặc là classpath thiết lập funny hoặc một bản sao của các tập tin thuộc tính ngồi một nơi nào đó mà là trên classpath. – Paul
Vui lòng đăng toàn bộ dấu vết ngăn xếp. – Paul
số dòng ở đây là gì: 'at com.pvminecraft.points.Points.buildMessages (Unknown Source)'. Phiên bản JDK của bạn là gì? – Kowser