Почему мое приложение Java не может найти файл my properties
у меня есть простое приложение, которое читает и записывает в файл свойств. Он был разработан в NetBeans и при запуске из Netbeans работает просто отлично. Однако теперь я построил и развернул его, файл свойств не может быть найден.
Структура Проекта
com/company/projectname/controller/controllerclass.java <- this is where the code using the properties file exists
conf/runController.properties <- the properties file, this exists here
в коде у меня есть следующее для доступа к файлу свойств:
private final String PROPERTIESFILELOCATION = "conf/runController.properties";
public void runController(){
this.runController = new Properties();
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION);
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile());
this.runController.load(propsInput);
}
(обобщил для краткости)
когда я вызываю файл jar из командной строки I выпуск:
java -classpath /usr/java/projectdirectory/project.jar com.company.projectname.controller.controllerclass arg1
Итак, мне удалось достичь этого раньше на других проектах именно таким образом, но по какой-то причине это не работает.
Я проверил структуру внутри файла jar, и все, как ожидалось, там.
может ли кто-нибудь указать на мою ошибку и помочь мне получить это и работает, пожалуйста?
EDIT-изменил имена, чтобы соответствовать поперек. Они всегда были последовательны в моем коде
4 ответов
Ваш вопрос говорит о
conf / controller.свойства
и ваш код говорит о conf/runController.properties
EDIT: я предполагаю, что conf/*.свойства находятся внутри вашего файла jar. Если это так, то ваш код должен работать, если файлы названы правильно.
возможно, FileInputStream не может соблюдать свойства "файл", который находится внутри вашего файла jar. Изменить:
this.runController = new Properties();
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION);
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile());
this.runController.load(propsInput);
в:
this.runController = new Properties();
this.runController.load(this.getClass().getClassLoader().getResourceAsStream(this.PROPERTIESFILELOCATION));
изменить: Я создал тестовый класс, и он показывает, что при запуске из файловой системы или из файла JAR "props/main.свойства "работает, но" / реквизит / main.свойства" не:
[rtb@rtblinux props]$ cat org/dashrb/test/main.java
package org.dashrb.test;
import java.util.Properties;
import java.io.IOException;
public class main
{
public static void main(String args[])
{
main myMain = new main();
myMain.testProps("props/main.properties");
myMain.testProps("/props/main.properties");
}
public main()
{
}
public void testProps(String p)
{
try
{
System.out.println("===============================");
Properties props = new Properties();
System.out.println("Trying to load properties as " + p);
props.load(getClass().getClassLoader().getResourceAsStream(p));
System.out.println("Loaded properties as " + p);
System.out.println("Property x is: " + props.getProperty("x"));
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
System.out.println("===============================");
}
}
[rtb@rtblinux props]$ cat props/main.properties
x = This is the property value of x
[rtb@rtblinux props]$ java -cp . org.dashrb.test.main
===============================
Trying to load properties as props/main.properties
Loaded properties as props/main.properties
Property x is: This is the property value of x
===============================
===============================
Trying to load properties as /props/main.properties
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)
at org.dashrb.test.main.testProps(main.java:25)
at org.dashrb.test.main.main(main.java:11)
[rtb@rtblinux props]$ jar cvf main.jar org props
added manifest
adding: org/(in = 0) (out= 0)(stored 0%)
adding: org/dashrb/(in = 0) (out= 0)(stored 0%)
adding: org/dashrb/test/(in = 0) (out= 0)(stored 0%)
adding: org/dashrb/test/main.class(in = 1218) (out= 679)(deflated 44%)
adding: org/dashrb/test/main.java(in = 594) (out= 287)(deflated 51%)
adding: props/(in = 0) (out= 0)(stored 0%)
adding: props/main.properties(in = 36) (out= 36)(deflated 0%)
[rtb@rtblinux props]$ jar tvf main.jar
0 Fri Jan 11 17:29:40 EST 2013 META-INF/
68 Fri Jan 11 17:29:40 EST 2013 META-INF/MANIFEST.MF
0 Fri Jan 11 17:26:00 EST 2013 org/
0 Fri Jan 11 17:26:00 EST 2013 org/dashrb/
0 Fri Jan 11 17:29:24 EST 2013 org/dashrb/test/
1218 Fri Jan 11 17:28:52 EST 2013 org/dashrb/test/main.class
594 Fri Jan 11 17:29:24 EST 2013 org/dashrb/test/main.java
0 Fri Jan 11 17:26:40 EST 2013 props/
36 Fri Jan 11 17:26:40 EST 2013 props/main.properties
[rtb@rtblinux props]$ cd /
[rtb@rtblinux /]$ java -cp ~/misc/src/java/props/main.jar org.dashrb.test.main
===============================
Trying to load properties as props/main.properties
Loaded properties as props/main.properties
Property x is: This is the property value of x
===============================
===============================
Trying to load properties as /props/main.properties
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)
at org.dashrb.test.main.testProps(main.java:25)
at org.dashrb.test.main.main(main.java:11)
в вашей ситуации должно быть что-то другое, что мешает вашему успеху.
Если вы используете getResource
чтобы открыть файл свойств, который предполагает, что файл находится в пути к классам, поэтому вам нужно поместить файл свойств в путь к классам. Альтернативы чтобы добавить папку Conf в classpath, или переместить файл свойств, так что это в существующих классов.
одна вещь, которая может помочь, - это ссылаться на местоположение файла с начальной косой чертой, поэтому нет никаких сомнений в том, что вы хотите начать поиск файла из корня пути к классам. В противном случае путь поиска относится к классу, из которого ваш код делает вызов (не знаю, что это правильно; так это работает с классом.getResource, загрузчик классов.getResource может быть другим, хотя).
спасибо всем за помощь, особенно dashrb, плюс 1 для вашего кода.
мне удалось заставить его работать с вашей помощью. Окончательным решением этой проблемы было небольшое изменение курса.
поскольку мне нужно было читать и писать в файл (возможно, не ясно в моем OP), я переключился на использование Apache.палата общин.конфигурация.
это сказало, что указатели в этом потоке гарантировали, что мои другие файлы свойств работали без цеплять.
еще раз спасибо