2010-06-08 13 views
30

Mam prosty projekt java maven. Jedna z moich klas podczas wykonywania musi załadować plik konfiguracyjny xml ze ścieżki klasy. Nie chcę pakować takiego pliku xml podczas tworzenia słoika, ale chcę dołączyć domyślny plik xml w zespole zip pod podfolderem conf, a także chcę, aby ten domyślny xml był dostępny w testach jednostkowych, aby go przetestować.Gdzie w ścieżce projektu maven powinienem umieścić pliki konfiguracyjne, które nie są uważane za zasoby

Jak widzę to są 2 możliwe miejsca domyślnej XML:

  1. src/main/resources/conf/default.xml
  2. src/main/conf/default.xml

żądać Oba rozwiązania specjalne działania pom:

  • W rozwiązanie 1, otrzymuję kopię automatyczną do folderu docelowego podczas b uild, co oznacza, że ​​jest dostępny w testach, ale też dostaję go w wyprodukowanym słoiku, którego nie chcę.

  • W rozwiązaniu 2 otrzymuję słoik tak, jak chcę (bez xml), ale muszę ręcznie skopiować xml do folderu docelowego, aby był dostępny do testowania. (Nie chcę dodawać podfolderów src w ścieżce klasy testowej. Myślę, że jest to zła praktyka).

Pytanie: jakie jest najlepsze rozwiązanie obu?
- Jeśli poprawne jest 2, jaki jest najlepszy sposób na skopiowanie go do folderu docelowego?
- Czy istnieje inne rozwiązanie lepsze i bardziej powszechne niż te dwa?

(Czytałem również Where should I put application configuration files for a Maven project?, ale chciałbym poznać najbardziej "poprawne rozwiązanie" z punktu widzenia "konwencja przez konfigurację", a to łącze zapewnia pewne rozwiązania typu konfiguracji, ale nie jest zorientowane na konwencje. jeden, ale mimo to pytam.) Dostarczone rozwiązania zawierają wtyczkę AntRun i wtyczkę appAssembler i zastanawiam się, czy mógłbym to zrobić bez nich.)

Odpowiedz

37

Pytanie brzmi, jakie jest najlepsze rozwiązanie obu? Jeśli poprawne jest 2, jaki jest najlepszy sposób na skopiowanie go do folderu docelowego? Czy istnieje jakieś inne rozwiązanie lepsze i bardziej powszechne niż te dwa?

Ponieważ chcesz, że plik ma zostać skopiowany do folderu target/classes, to w jakiś sposób należy traktować jako zasób (więc albo umieścić w ramach src/main/resources lub zadeklarować src/main/conf jako katalogu zasobów).A jeśli nie chcesz go w ostatecznej słoiku skonfigurować Maven JAR Plugin wykluczyć go:

<project> 
    ... 
    <build> 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <configuration> 
      <excludes> 
      <exclude>**/conf/*</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 
    ... 
</project> 

Dla części montażowej, montaż deskryptory są dość elastyczne, więc powinno być możliwe, aby osiągnąć to, co chcesz niezależnie od wybór. Sugeruję jednak użycie najłatwiejszej konfiguracji.

+1

Oblęcy z obydwoma rozwiązaniami: 1./deklarowanie "conf" jako zasobu nadal zawiera je w słoiku i nie pozostawia nam łatwego sposobu na wykluczenie; 2./tworzenie zasobów wewnętrznych "conf" i wyłączenie go w wtyczce powoduje, że nie znajduje się on w katalogu głównym ścieżki klasy. – YoYo

+0

z jakiegoś powodu jest to jedna z nielicznych ogólnie użytecznych odpowiedzi na pytanie "jak wykluczyć coś z słoika z maven" podczas wyszukiwania w Google ... nawet jeśli nie odpowiada dokładnie na OP, to nadal jest świetnym przykładem użycia 'maven-jar -plugin' – mmcrae

1

Można umieścić go w src/test/conf/default.xml. Twoje klasy testowe mogą je znaleźć, ale nie będą one pakowane przy użyciu standardowej metody.

Z dodatkowym zestawem można go spakować stamtąd. Ten krok jest zawsze konieczny.

Innym rozwiązaniem może być utworzenie osobnego modułu maven i umieszczenie go w/src/main/resources/conf/.... Następnie należy ustawić ten słoik jako zależność testową. Nie musisz wykonywać żadnej specjalnej konfiguracji wtyczki, ale myślę, że jest to przesada dla pojedynczego pliku.

+0

Rzecz dont like z tego rozwiązania jest to, że zespół wytwarzania zamek będzie musiał dostać od src/test/conf i ten xml jest nie tylko plikiem testowym. Zakładam, że proponowane przez ciebie rozwiązanie jest takie samo, jeśli zamiast tego umieściłem je w src/main/conf? Z tego miejsca jest ono również widoczne dla testów z folderu target/classes zamiast target/test- klasy Czy to źle, aby robić testy, które pobierają dane z obiektu docelowego/klas lub czy zależą tylko od klasy docelowej/testowej? – Paralife

1

Moje rozwiązanie było użyć dwóch profili: Rozwój (domyślnie) i opakowania

Moja default/sekcja zawiera zarówno src/main/zasobów i src/main/conf. Nazywam to moim profilem rozwoju, który jest niejawnym profilem.

Mój profil pakowania jest profilem jawnym, który został zdefiniowany w sekcji. Tam w/tylko wspomniałem tylko src/main/resources. Kiedy uruchamiam mój skrypt opakowaniowy (mamy obecnie zewnętrzne narzędzie do majsterkowania od czasu zbudowania RPM z naszej WAR), używam "mvn install -Drpm", aby aktywować mój profil pakowania (rpm jest identyfikatorem dla opakowania profil.

Jeśli to nie było wystarczająco jasne, nie krępuj się zadawać więcej pytań.

Powiązane problemy