2010-07-28 15 views
5

Zainspirowany to pytanie:platforma Java: Jak zarządzać ustawienia konfiguracji dla każdego programisty

How to manage Configuration Settings for each Developer

Jak zarządzać ustawieniami konfiguracji aplikacji, które muszą być określone dla każdego dewelopera bez sprawdzania ich do kontroli źródła na platformie Java?

Na przykład, jest to rodzaj rzeczy robimy teraz:

  • konfiguracji DataSource jest przechowywany w pliku konfiguracyjnym xml wiosny.

  • Obecnie każdy programista edytuje plik i dokłada wszelkich starań, aby ten plik nie został włączony do kontroli kodu źródłowego. Wielu z nas ma łatki (pliki diff), które są stosowane do kodu przed wykonaniem testów w naszej lokalnej bazie danych i usunąć poprawkę przed sprawdzeniem kodu. Inni programiści ręcznie edytują i przywracają pliki konfiguracyjne.

  • Niestety, łatki stają się nieaktualne. Ludzie czasami zapominają przywrócić swoją lokalną konfigurację przed zatwierdzeniem.

Moje pytanie nie ogranicza się jednak do ustawień połączenia z bazą danych. Chciałbym znaleźć rozwiązanie, w którym każdy programista może przesłonić ustawienia konfiguracji aplikacji bez konieczności zmiany plików kontrolowanych przez źródło.

Jeżeli musimy zmienić sposób, w jaki jesteśmy przechowywania ustawień konfiguracyjnych, to myślę, że powinniśmy to (być może zewnętrzne pliki konfiguracyjne JNDI ?, w znanej ścieżce ?, nie wiem)

zrobić Co zrobiłbyś/zrobiłeś?

Odpowiedz

2

Umieść plik konfiguracyjny w zewnętrznym katalogu. Jeśli go nie ma, przeczytaj domyślny plik konfiguracyjny. Katalog zewnętrzny może być konfigurowalny i może mieć wartość domyślną, na przykład c:\workspace\config.

Opcjonalnie podczas kompilacji można skopiować zewnętrzne właściwości do artefaktu kompilacji.

+0

Myślałem również o zrobieniu tego. Maven stosuje podobne podejście: szuka pliku $ MAVEN_HOME/settings.xml. Jeśli nie ma, używa wartości domyślnych konfiguracji. Jedynym problemem jest rozwiązanie problemu między różnymi platformami ścieżek w systemie Windows i * nix. Być może powinno wystarczyć podejście zmienne środowiskowe przy użyciu $ MY_SYSTEM_HOME. dzięki! –

1

Najlepszym miejscem do takiej konfiguracji jest baza danych. Dodaj kilka linii do kodu produkcyjnego, aby przeczytać te konfiguracje. Nie oznacza to żadnej szkody, dopóki cel nie zostanie rozwiązany, a wszystko jest spójne i spójne. Umieść małą strukturę, która odczytuje te konfiguracje i zastępuje te domyślne, które pojawiają się w produkcji.

Na szczęście niektóre z frameworków, takich jak Rails, zapewniają taką możliwość i jestem pewien, że jest ona elastyczna również w Javie.

+2

... i jak kod będzie wiedział, z której bazy danych korzystać? – meriton

+0

Tak, obawiam się, że sposób bazy danych nie jest tym, co lubię najbardziej. Jest to jedyne podejście, jakie wypróbowałem i znalazłem 2 wady: 1) Masz tendencję do używania struktur konfiguracyjnych podobnych do tabel, które nie zawsze są najlepszym rodzajem struktury lub bloków pola xml, które nie są łatwe do edycji; 2) musisz ponownie rozwiązać problem ustawienia połączenia z bazą danych w jakiś sposób poza bazą danych. –

1

Jedną z rzeczy, którą tutaj zrobiliśmy, jest moduł ładujący, który najpierw sprawdza właściwości systemu.

np. masz właściwość o nazwie datasource.url, która zostanie wczytana do pliku Spring.

Rozszerzyliśmy moduł ResourceLoader, aby najpierw sprawdzić właściwości systemu, aby sprawdzić, czy istnieje właściwość o tej nazwie, a jeśli tak, to załaduje ją zamiast używać wartości z pliku właściwości. (Właściwie to myślę, że Spring ResourceBundleMessageSource robi to po wyjęciu z pudełka, jeśli go skonfigurujesz, ale chcieliśmy zachować niestandardowe zachowanie, do którego nie wejdę).

Tak więc, jeśli zaczniemy naszą aplikację z kilkoma dodatkowymi parametrami wiersza poleceń:

-Ddatasource.url=[local-datasource-url]

Następnie nadpisuje wartości z pliku właściwości.

Oczywiście jest to łatwiejsze do zrobienia dla aplikacji Swing (która była nasza) niż aplikacji internetowej, ale wciąż jest możliwa.

+0

Spróbuję tego. Dzięki. –

2

Wykonujemy kompozycję całkowicie samodzielnie, w tym takie rzeczy jak lokalne bazy danych H2/Hipersonic/JavaDB i serwery poczty Ruby. Oznacza to, że lokalna kompilacja nie ma specyficznej konfiguracji programistycznej i wszystko wskazuje tylko na wstępnie pakowane komponenty. Oznacza to również, że oprócz podstaw (JVM, Ruby, Redakcja) jest zero czasu na skonfigurowanie skrzynki deweloperskiej.

Wadą jest to, że koszt Twojego kodu jest nieco większy.

+0

To brzmi bardzo ładnie. Obawiam się, że nie jesteśmy jeszcze na tym poziomie automatyzacji dzięki naszemu zarządzaniu budową i konfiguracją, ale jest to świetna odpowiedź. Dziękuję Ci. –

2

Sprawdź plik szablonu (np. Sample.context.xml) w formancie źródłowym. Każdy programista kopiuje ten plik do pliku context.xml i robi dowolne modyfikacje. Jeśli prawdziwy plik konfiguracyjny znajduje się w katalogu kontrolowanym przez źródło, dodaj go do svn: ignore, aby zapobiec przypadkowym masek.

==> Bez przypadkowych zatwierdzeń i trwałych lokalnych ustawień konfiguracyjnych.

Jeśli brakuje lokalnego pliku konfiguracyjnego, aplikacja nie uruchamia się. To sprawia, że ​​dla nowych członków zespołu oczywiste jest, że można skonfigurować ustawienia. Oczywiście serwer integracji ciągłej również będzie wymagał pliku ustawień lokalnych.

Jeśli chodzi o lokalizację tej konfiguracji: ułatwia ona kompilację i wdrażanie, jeśli konfiguracja specyficzna dla instancji nie jest częścią pliku .war. Używamy wpisów JNDI, które można łatwo wyszukać z plików konfiguracyjnych wiosennych przy użyciu <j2ee:jndiLookup>.

+0

Ma to wiele sensu i byłoby to w moim przypadku najłatwiejsze (bliższe) rozwiązanie, ponieważ korzystam już z plików kontrolowanych przez źródło. Musimy tylko dodać je do listy ignorowanych. dzięki –

Powiązane problemy