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ć.
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"));
}
}
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 ...
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