Как файл JAR может читать внешний файл свойств - PullRequest
7 голосов
/ 11 августа 2010

У нас есть компонент пула соединений (файл JAR) для одного из наших приложений.На данный момент сведения о подключении приложения связаны с файлом JAR (в файле .properties).

Можем ли мы сделать его более общим?Можем ли мы заставить клиента сообщить подробности файла свойств (как путь, так и имя файла) и использовать JAR для получения соединения?

Имеет ли смысл иметь что-то подобное в коде клиента:

XyzConnection con = connectionIF.getConnection(uname, pwd);

Наряду с этим клиент будет указывать (каким-то образом ???) подробности файла свойств, в которых есть URL-адреса для подключения, время ожидания и т. Д.

Ответы [ 7 ]

15 голосов
/ 11 августа 2010

Самый простой способ - использовать ключ -D, чтобы определить системное свойство в командной строке Java.Это системное свойство может содержать путь к вашему файлу свойств.

Например:

java -cp ... -Dmy.app.properties=/path/to/my.app.properties my.package.App

Затем в вашем коде вы можете сделать это (обработка исключений не показана для краткости):

String propPath = System.getProperty( "my.app.properties" );

final Properties myProps;

if ( propPath != null )
{
     final FileInputStream in = new FileInputStream( propPath );

     try
     {
         myProps = Properties.load( in );
     }
     finally
     {
         in.close( );
     }
}
else
{
     // Do defaults initialization here or throw an exception telling
     // that environment is not set
     ...
}
8 голосов
/ 11 августа 2010

http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html

доступно несколько подходов, статья выше предоставляет более подробную информацию

 ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
 Class.getResourceAsStream ("/some/pkg/resource.properties");
 ResourceBundle.getBundle ("some.pkg.resource");
6 голосов
/ 11 августа 2010

Просто загрузите свойства из файла, что-то вроде

Properties properties = new Properties();
InputStreamReader in = null;
try {
     in = new InputStreamReader(new FileInputStream("propertiesfilepathandname"), "UTF-8");
     properties.load(in);
} finally {
     if (null != in) {
         try {
             in.close();
         } catch (IOException ex) {}
     }
}

Обратите внимание, что кодировка явно указана как UTF-8 выше.Он также может быть пропущен, если вы примете кодировку по умолчанию ISO8859-1, но остерегайтесь любых специальных символов.

2 голосов
/ 02 октября 2017

Это моё решение. Сначала ищите app.properties в папке автозагрузки, если не существует, попробуйте загрузить из вашего JAR-пакета:

File external = new File("app.properties");
if (external.exists())
    properties.load(new FileInputStream(external));
else 
    properties.load(Main.class.getClassLoader().getResourceAsStream("app.properties"));
1 голос
/ 31 марта 2016

Самый простой способ ниже.Он загрузит application.properties из папки cfg вне файла jar.

Структура каталогов

  |-cfg<Folder>-->application.properties
  |-somerunnable.jar

Код:

    Properties mainProperties = new Properties();
    mainProperties.load(new FileInputStream("./cfg/application.properties"));
    System.out.println(mainProperties.getProperty("error.message"));
0 голосов
/ 17 мая 2018

В netbeans мне нужно было загрузить application.properties из папки conf/ вне файла jar.

Поэтому я написал:

public static String getProperty(String FileName, String Prop)
{   

    try {  
        FIS = new FileInputStream( "./../conf/"+FileName);
        Properties properties;
        (properties = new Properties()).load(FIS);          

        for(Enumeration propKeys = properties.propertyNames();
                propKeys.hasMoreElements();){
            String tmpKey = (String) propKeys.nextElement();
            String tmpValue = properties.getProperty(tmpKey);                   

            tmpValue = tmpValue.trim();
            if (tmpKey.equals(Prop)){
                //System.out.println(tmpKey +"="+tmpValue);
                properties.put(tmpKey, tmpValue);
                Value = properties.getProperty(Prop);
                break;
            }

        }

        if (Value==null){
            throw new Exception("La Propiedad : "+Prop+" no Se encuentra en el Archivo de Configuracion");
        } 

    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return Value;

}

Для Eclipse примените следующее:

FIS = new FileInputStream( "../conf/"+FileName);
0 голосов
/ 06 сентября 2017
public static String getPropertiesValue(String propValue) {
        Properties props = new Properties();
        fileType = PCLLoaderLQIOrder.class.getClassLoader().getResourceAsStream(propFileName);
        if (fileType != null) {
            try {
                props.load(fileType);
            } catch (IOException e) {
                logger.error(e);
            }
        } else {
            try {
                throw new FileNotFoundException("Property file" + propFileName + " not found in the class path");
            } catch (FileNotFoundException e) {
                logger.error(e);
            }
        }
        String propertiesValue = props.getProperty(propValue);
        return propertiesValue;
    }

Методы, описанные выше, работают для меня, просто сохраните ваш файл свойств в каталоге, из которого будет запускаться ваш jar-файл, и укажите это имя вместо propFileName, когда вам нужно любое значение из свойства, просто вызовите getPropertyValue("name").

...