Estoy escribiendo una aplicación (específicamente un complemento para el servidor Bukkit Minecraft). Hacer esto requiere que acceda a un archivo .properties desde el JAR de la aplicación. Aquí es donde encuentro un extraño problema. Cuando pruebo el programa en mi PC de desarrollo, funciona bien. El archivo .properties se carga y todo está bien. Sin embargo, en la otra computadora en la que lo pruebo, intento iniciar la aplicación y no puede cargar las propiedades, y el InputStream
es null
. Aquí está el método en el que me carga el archivo:No se puede acceder al recurso en un JAR en todas las computadoras
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);
}
}
}
he omitido algún código irrelevante, pero que es la esencia de la misma. La estructura del JAR es el siguiente:
com/
pvminecraft/
points/
Points.java <-- The class where the file is loaded
resources/
messages.properties <-- The file being loaded
En mi PC se carga el archivo de resources/messages.properties
, pero por otro archivo, el InputStream
es nula, y está dirigido mi bloque catch
para la NullPointerException
. ¿Qué podría estar causando el problema y cómo podría solucionarlo? Gracias.
Actualización: Incluso utilizando la ruta completa (/com/pvminecraft/points/resources/messages.properties
), el mismo problema persiste.
Actualización 2: Aquí está la pila-traza completa:
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)
todas las cosas y org.bukkit
org.craftbukkit
es el servidor. El archivo .properties se carga en el método buildMessages
, llamado por el método onEnable
de Points
.
Actualización 3: En una nueva instalación de Arch Linux, el archivo de propiedades del mensaje se carga correctamente y todo está bien. El servidor remoto es Ubuntu Linux, y mi PC de desarrollo es Arch.
Actualización 4: Muy bien, esto es una especie de resolución. Parece ser un problema localizado. Lo digo porque he logrado acceder a dos computadoras más y el programa se ejecuta correctamente en ambas. Si bien es molesto, esto no parece ser nada malo con mi código o compilación de scripts. Todavía estoy queriendo saber qué está mal, pero ya no está presionando. Continuaré investigando esto. Gracias a todos.
El directorio "recursos" no se encuentra en el classpath; consulte la respuesta de Tom. El directorio "com/pvminecraft/points/resources" es, sin embargo. Comprueba tu entorno de desarrollo: creo que tienes el classpath divertido o una copia de los archivos de propiedades en algún lugar de la classpath. – Paul
Por favor, publique todo el seguimiento de la pila. – Paul
cuál es el número de línea aquí: 'at com.pvminecraft.points.Points.buildMessages (fuente desconocida)'. ¿Cuál es tu versión JDK? – Kowser