2011-02-01 23 views
5

Mam kilka systemów, które wszystkie muszą załadować te same właściwości do JVM. Mogę użyć flagi -D do załadowania jednej właściwości na raz, ale szukam czegoś, co spowoduje załadowanie wszystkich właściwości w całym pliku naraz. Na przykład:Przekazywanie całego pliku do argumentów JVM

Mogę po prostu dodać --options-file = blah.properties do wszystkich jvms w mojej sieci, raz i od tej pory tylko zmienić plik właściwości, który może być pojedynczym plikiem centralnym w udziale sieciowym .

Dziękuję

EDIT: Wszelkie argumenty lub polecenia muszą również pracować w środowisku Windows. W związku z tym wszelkie bash lub skrypty hack specyficzne dla Uniksa nie będą działać.

Odpowiedz

6

To mniej więcej jak to robimy:

java $(tr '\n' ' ' < options_file) other args...

Tutaj options_file zawiera gotowe -Dsomething lub -Xsomething wartości, po jednym w wierszu. Komenda tr po prostu zastępuje każdy znak nowej spacji.

+1

Nie sądzę, że to zadziała w Windows. – doug

+1

@doug: nie będzie. W systemie Windows potrzebujesz czegoś takiego jak 'for/S delim = ...', nie pamiętam, ale okna umożliwiają odczytanie pliku wiersz po linii; dodajesz te linie do zmiennej środowiskowej. – 9000

+0

OK, spróbuję. Dzięki, – doug

3

Niektóre opcje:

  1. owinąć właściwości w pliku .jar, a następnie dostać się do procesów, które odczytać plik właściwości z getClass().getResourceAsStream()
  2. Napisz plik wsadowy do wykonania procesów Java i jawnie listy opcje -D lub dynamicznie twórz linię poleceń.

Rozwiązuję ten problem normalnie, używając Spring (używanego również z innych powodów) i PropertyPlaceholderConfigurer. To pozwala mi określić jedną lub więcej lokalizacji dla plików właściwości i modyfikuje konfigurację Spring na miejscu.

+1

getClass(). GetResourceAsStream() jest coś zrobić wewnątrz aplikacji po to się zaczęło, prawda? Potrzebuję, aby to się stało, zanim jakakolwiek aplikacja zostanie uruchomiona. – doug

7

Nie sądzę, można to zrobić za pomocą linii poleceń (bez niektórych hacki Bash, być może), ale na pewno można to zrobić programowo:

Wystarczy ustawić jedną właściwość -DmyPropertiesFile=/your/properties/file.properties a potem przeczytałem, że jeden z przeciążenie Properties.load(). Po tym, System.setProperties(yourProps) powinien zrobić to, czego się spodziewać.

Oczywiście wymaga to, abyś mógł wczytać ten kod wystarczająco wcześnie, aby twoje właściwości były dostępne w razie potrzeby (na przykład, jeśli metoda main() jest twoja, jest to idealne).

+0

Nie sądzę, że to zadziała, ponieważ zarówno aplikacja internetowa, jak i aplikacja log4j potrzebują dostępu do tych samych zmiennych ... – doug

0

Jeśli użyjesz Anta do lanuch procesu Java, odpowiedź 9000 (plus jego komentarz do Windowsa) zadziała, i możesz mieć wyrzutnie radzić sobie z różnicą OS.

Jest wątek StackOverflow here który opisuje jak określić OS od mrówek

Powiązane problemy