2012-01-31 14 views
7

Oto mały przykład tego, co chciałbym osiągnąć:rozpowszechniać pliki XSD na wielu artefaktów Mavena

Maven Artifact A jest jednym z wielu Webservices i definiuje schematu XSD z definicji dla żądań i odpowiedzi. (src/main/resources/xsd)

Artefakt A zależy od Artefaktu B, który jest prostym Projektem JAR i zawiera wiele XSD-ów z opisami typów niskopoziomowych. (Src/main/resources/XSD)

W XSD w Artifact A korzystając z definicji typu (to), które są określone raz w Artifact B.

Jeśli w ogóle możliwe, naprawdę chciałbym wiedzieć, jak dołącz pliki xsd, które znajdują się w słoiku, który jest ładowany jako zależność od maven i jak rozwiązać webservice xsd (i wsdl) w IDE takich jak Netbeans i Eclipse.

Jeśli to podejście wydaje się być egzotyczne - czy istnieją lepsze praktyki dotyczące czystego projektu?

aktualizacja

Pierwszy jest prosty przykład jak spodziewałbym schemat należą do pracy ....

Artifact A (WAR Module) 
POM: 
... 
<artifactId>A</artifactId> 
... 
<dependency> 
    <artifactId>B</artifactId> 
    ... 
</dependency> 

Schema: 
.... 
<xs:include schemaLocation="classpath://net/elfwyn/xsd/schema.xsd"/> 
.... 

Artifact B (JAR Module) 

Schema Location: 
src/main/resources/net/elfwyn/xsd/schema.xsd 

Wydaje się, że kilka sollutions do problemu jak ten, ale nie wiem, jak je wdrożyć w moim środowisku:

Wiem o rozwiązaniach do rozpoznawania katalogów osadzonych w IDE (netbeans7.1) (dla środowiska dev) i dostępnych jako wtyczki Maven (dla środowiska produktywnego), at powinien być w stanie określić alias na lokalizacji pliku schematu. Ten alias powinien następnie zostać użyty jako lokalizacja schematu.

Jednak nie wiem, jak określić plik Catalog.xml, który uzyskuje dostęp do schematów wewnątrz pliku JAR. Dla mnie wydaje się, że jest to ten sam problem, co bezpośrednio w lokalizacji schematu. Istnieje również obciążenie związane z utrzymaniem katalogu dla każdego projektu WAR, którego raczej nie chciałbym podjąć, jeśli w ogóle jest to możliwe.

Jeśli chodzi o wtyczkę Mavena, to nie znalazłem jeszcze niczego rozstrzygającego.

Inne sources wdrażają resolverowi katalogowy zwyczaj w kontekście JAX-b, ale nie mogę jeszcze zobaczyć ewentualne hak do wdrożenia takiego rozpoznawania nazw w środowisku Java-WS, i jak to powinno działać w połączeniu z maven-plugin wspomniany wyżej lub resolver IDE Catalog ...

Odpowiedz

6

Myślę, że twoje pytanie jest uzasadnione. W przeszłości często stwierdzałem, że mam moduł Maven, który musi wykonać specjalne przetwarzanie na plikach, które można znaleźć w zależnych plikach JAR.

Co mam zrobić w przeszłości, aby artefakt b zależność artefaktu A. Następnie w pom.xml artefaktu AI użyć specjalnej konfiguracji wtyczki Maven zależności następująco:

<plugin> 
    <!-- Used to pull XSD files from the JAR --> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
      <execution> 
       <id>unpack-xsd-files</id> 
       <!-- Using the initialize phase because it is before the generate sources phase --> 
       <phase>initialize</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <!-- Artifact that Holds our custom templates --> 
           <groupId>com.mycorp</groupId> 
           <artifactId>artifact-b</artifactId> 
           <version>${artifact-b.version}</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
         <includes>**/*.xsd</includes> 
         <outputDirectory>${project.basedir}/target/xsd-includes</outputDirectory> 
        </configuration> 
      </execution> 
    </executions> 
</plugin> 

Teraz interesujące pliki XSD możesz znaleźć w katalogu docelowym Artefaktu A, a stamtąd możesz zrobić z nimi co chcesz. Możesz dołączyć je jako zasoby, odwołać się do nich z innych plików XSD, osadzić je w swoich własnych plikach JAR lub cokolwiek innego!Jak widać z konfiguracji, nie musisz także umieszczać ich w katalogu docelowym; możesz umieścić je bezpośrednio w swoim katalogu /src/main/resources.

Możesz dodać tę konfigurację do dowolnego modułu Maven, tak aby wiele modułów działało w ten sam sposób. Zaletą tego podejścia jest to, że będzie on działał także z Eclipse poprzez M2Eclipse.

+0

Nadal nie miałem czasu, by sprawdzić twoje rozwiązanie, ale ponieważ brzmi to bardzo rozsądnie, a nagroda wkrótce się skończy, wezmę to za poprawną odpowiedź. Dziękuję Ci! – elfwyn

+0

@Stefan - Dzięki i zostaw komentarz tutaj, jeśli masz problem, a my przejdziemy przez to. – HDave

+0

Jeśli wiążesz to z 'initialize', czasami katalog' target' jeszcze nie istnieje. Miałem również ogromne problemy (w Eclipse, ale także przy użyciu 'mvn: compile') z przerażającym' źródłem nie może być katalog '5-letniego błędu w maven. +1 mimo wszystko, ponieważ jest to najczystsze rozwiązanie. – artbristol

Powiązane problemy