Załadować plik właściwości w JAR?

Mam problem, gdy jeden ze słoików, od którego zależy moja aplikacja internetowa, próbuje załadować plik właściwości z wnętrza słoika. Oto kod w słoiku.

static
{
    Properties props = new Properties();
    try 
    {
        props.load(ClassLoader.getSystemResourceAsStream("someProps.properties"));
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
    someProperty = props.getProperty("someKey");
}

Plik Właściwości znajduje się w moim katalogu" src/main / resources" projektu Maven. Kiedy uruchamiam ten kod z mojego testu junit w Eclipse, wykonuje on dobrze. Gdy projekt jest zbudowany z Maven do jar, i włączone jako zależność w mojej aplikacji internetowej, nie znajduje pliku właściwości. Wiem, że właściwości plik jest w katalogu bazowym jar, Nie wiem jak to naprawić.

Author: Paolo Forgia, 2010-05-12

2 answers

Problem polega na tym, że używasz getSystemResourceAsStream. Użyj po prostu getResourceAsStream. Zasoby systemowe ładują się z system classloader, który prawie na pewno nie jest klasą ładującą, do której jest ładowany jar, gdy jest uruchamiany jako aplikacja webapp.

Działa w Eclipse, ponieważ podczas uruchamiania aplikacji, system classloader jest skonfigurowany z Twoim jar jako częścią jego classpath. (Np. java-jar my.słoik załaduje mi.jar w klasie systemowej loader.) Tak nie jest w przypadku aplikacji internetowych-serwerów aplikacji użyj złożonych klas ładowania, aby odizolować aplikacje webowe od siebie i od wewnętrznych serwerów aplikacji. Na przykład, zobacz Tomcat classloader how-to i schemat stosowanej hierarchii classloader.

EDIT: Zwykle wywołujesz getClass().getResourceAsStream(), Aby pobrać zasób ze ścieżki classpath, ale gdy pobierasz zasób w statycznym inicjalizatorze, będziesz musiał jawnie nazwać klasę, która znajduje się w classloaderze, z którego chcesz załadować. Najprostszym podejściem jest Użyj klasy zawierającej inicjalizator statyczny, np.

[public] class MyClass {
  static
  {
    ...
    props.load(MyClass.class.getResourceAsStream("/someProps.properties"));
  }
}
 72
Author: mdma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 14:35:50

Dla przypomnienia, jest to udokumentowane w Jak dodać zasoby do mojego słoika? (ilustrowany dla testów jednostkowych, ale to samo dotyczy" zwykłego " zasobu):

Aby dodać zasoby do classpath dla twoje testy jednostkowe, postępujesz tak samo wzór jak przy dodawaniu zasobów do słoika z wyjątkiem katalogu, który umieść zasoby w is ${basedir}/src/test/resources. Na w tym punkcie masz projekt struktura katalogów, która wyglądałaby jak poniżej:

my-app
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- mycompany
    |   |           `-- app
    |   |               `-- App.java
    |   `-- resources
    |       `-- META-INF
    |           |-- application.properties
    `-- test
        |-- java
        |   `-- com
        |       `-- mycompany
        |           `-- app
        |               `-- AppTest.java
        `-- resources
            `-- test.properties

W test jednostkowy przydałby się prosty fragment kodu jak poniżej do dostęp do zasobów wymaganych do testowanie:

...

// Retrieve resource
InputStream is = getClass().getResourceAsStream("/test.properties" );

// Do something with the resource

...
 13
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-12 03:56:07