2012-01-31 27 views
7

Ecco un piccolo esempio di quello che vorrei realizzare:Distribuire file XSD su più Artefatti Maven

Maven Artefatto A è uno dei tanti Webservices e definisce uno schema XSD con definizioni per richieste e risposte. (src/main/resources/xsd)

L'artefatto A dipende da Artefatto B che è un semplice progetto JAR e contiene una moltitudine di XSD master con descrizioni di livello basso. (Src/main/risorse/xsd)

I XSD in Artifact A utilizzare le definizioni del tipo (comprendono) che sono specificati volta in Artifact B.

Se possibile mi piacerebbe davvero sapere come include i file xsd che si trovano in un jar che viene caricato come una dipendenza da Maven e come risolvere il webservice xsd (e wsdl) in IDE come Netbeans ed Eclipse.

Se questo approccio sembra esotico, esistono migliori pratiche per un design pulito?

aggiornamento

Prima ecco un semplice esempio di come mi sarei aspettato lo schema includono lavorare ....

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 

Sembra che ci siano diversi sollutions per un problema come questo, ma non so come implementarli nel mio ambiente:

Conosco i Cataloghi Resolver incorporati nell'ID (netbeans7.1) (per ambiente di sviluppo) e disponibili come Plugin Maven (per ambiente produttivo), th dovrebbe essere in grado di specificare un alias nella posizione del file di schema. Questo alias dovrebbe quindi essere utilizzato come posizione dello schema.

Tuttavia non so come specificare un Catalog.xml che accede a schemi all'interno di un file JAR. Per me sembra essere lo stesso problema che specificarlo direttamente nella posizione dello schema. Inoltre c'è il sovraccarico di mantenere il catalogo per ogni WAR - progetto che preferirei non intraprendere se possibile.

Per quanto riguarda il plug-in Maven, non ho ancora trovato nulla di conclusivo.

Altro sources stanno attuando un sistema di risoluzione catalogo personalizzato nel contesto di JAX-b, ma non si può ancora vedere un possibile gancio per l'attuazione di un tale resolver in un ambiente Java-WS, e come dovrebbe funzionare in combinazione con il maven-plugin menzionato sopra o il resolver del catalogo IDE ...

risposta

6

Penso che la tua domanda sia ragionevole. In passato ho spesso scoperto di avere un modulo Maven che deve eseguire elaborazioni speciali su file che possono essere trovati in JAR dipendenti.

Quello che ho fatto in passato, è quello di rendere Artefatto B una dipendenza di Artefatto A. Poi nel pom.xml di Artefatto AI utilizzare una configurazione speciale del plugin di dipendenza Maven come segue:

<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> 

Ora i tuoi file XSD di interesse possono essere trovati nella directory di destinazione di Artefatto A e da lì puoi fare tutto quello che vuoi con loro. Puoi includerli come risorse, fare riferimento ad essi da altri file XSD, incorporarli nei tuoi JAR o qualsiasi altra cosa!Come puoi vedere dalla configurazione, non devi metterli nella tua directory di destinazione; potresti metterli direttamente nella tua directory /src/main/resources.

È possibile aggiungere questa configurazione a qualsiasi modulo Maven che si desidera in modo che più moduli possano funzionare allo stesso modo. La cosa bella di questo approccio è che funzionerà anche con Eclipse tramite M2Eclipse.

+0

Non avevo ancora tempo per controllare la tua solluzione, ma dato che suona molto ragionevole e la taglia si esaurirà presto prenderò questa come risposta corretta. Grazie! – elfwyn

+0

@Stefan - Grazie e lascia un commento qui se hai un problema e ci lavoreremo sopra. – HDave

+0

Se si associa a 'initialize', a volte la directory' target' non esiste ancora. Ho anche avuto grossi problemi (in Eclipse, ma anche usando 'mvn: compile') con il temuto' l'origine non deve essere una directory 'di 5 anni bug in maven. +1 in ogni caso poiché è la soluzione più pulita. – artbristol

Problemi correlati