2010-07-29 8 views
6

Questo è più di condivisione della conoscenza piuttosto che fare una domanda. Ho pensato che questo piccolo frammento di Ant potrebbe essere utile a qualcuno.Come creare un file jaxb.index al volo usando Ant (o Maven)

<target name="create-jaxb-index" depends="compile"> 
    <!-- Create a suitable jaxb.index file on the fly to remove the need for an ObjectFactory 
     jaxb.index is a simple list of the domain objects without package or extension, e.g. 
     org.example.Domain.java -> Domain 
    --> 
    <fileset id="domain-sources" dir="${src}"> 
     <include name="org/example/*.java"/> 
    </fileset> 
    <pathconvert property="domain-list" refid="domain-sources" pathsep="${line.separator}"> 
     <chainedmapper> 
     <flattenmapper/> 
     <globmapper from="*.java" to="*" casesensitive="false"/> 
     </chainedmapper> 
    </pathconvert> 
    <echo file="${target}/classes/org/example/jaxb.index" message="${domain-list}"/> 
    </target> 

OK, OK in modo da non andare fino in fondo e memorizzare tutte i nomi dei pacchetti in modo che possa ricostruire la struttura file appropriato, ma è abbastanza buono per iniziare.

Spero che aiuti.

Inoltre, si può solo inserire questo piccolo frammento (meno l'elemento di destinazione) in un Maven costruire in questo modo:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <phase>compile</phase> 
     <configuration> 
      <tasks> 
       <!-- Create a suitable jaxb.index file on the fly to remove the need for an ObjectFactory 
        jaxb.index is a simple list of the domain objects without package or extension, e.g. 
        org.example.Domain.java -> Domain 
       --> 
       <fileset id="domain-sources" dir="${build.sourceDirectory}"> 
       <include name="org/example/domain/*.java"/> 
       </fileset> 
       <pathconvert property="domain-list" refid="domain-sources" pathsep="${line.separator}"> 
       <chainedmapper> 
        <flattenmapper/> 
        <globmapper from="*.java" to="*" casesensitive="false"/> 
       </chainedmapper> 
       </pathconvert> 
       <echo file="${build.outputDirectory}/org/example/domain/jaxb.index" message="${domain-list}"/> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

Grazie, questo è utile! Se esci da un capello dall'ambito previsto di un quadro, allora entri in un inferno di stranezze e hack. A volte mi sento come se fossi stanco di Java, Maven, Groovy, ecc. – boumbh

+0

@boumbh Felice di aiutare. Un modo per ridurre la travolgente complessità dello sviluppo web è provare altre lingue. –

+0

Se solo avessi una scelta ^^. Prendo atto della tendenza odierna ad usare le mazze per rompere le noci. JAXB è una mazza molto efficiente, mi spacca molto bene (senza connotazione negativa), ma a volte mi manca la facile gestione di uno strumento più semplice. La problematica sarebbe stata diversa usando un'altra lingua. Non necessariamente migliore. Come alcuni dicono: "Un cattivo operaio incolpa sempre i suoi strumenti: un buon operaio ha gli strumenti giusti". Se non riesco a scegliere i miei strumenti, questo mi rende un cattivo operaio. – boumbh

risposta

2

Seguendo l'esempio di Gary, l'ho preso e l'ho esteso in modo che potesse funzionare per più di una directory di pacchetti. Il seguente dovrebbe funzionare se si ha la dipendenza antcontrib nel dipendenze del plugin:

<target> 
    <taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="maven.dependency.classpath" /> 
    <for param="dto-dir"> 
     <path> 
      <dirset dir="${basedir}/src/main/java"> 
       <include name="com/example/**/dto"/> 
      </dirset> 
     </path> 
     <sequential> 
      <property name="@{dto-dir}" basedir="${basedir}/src/main/java" relative="true" location="@{dto-dir}" /> 
      <echo message="Creating jaxb.index file for directory: ${@{dto-dir}}" /> 
      <echo message="@{dto-dir}" /> 
      <fileset id="@{dto-dir}_dtos" dir="@{dto-dir}"> 
       <include name="*Dto.java" /> 
      </fileset> 
      <pathconvert property="@{dto-dir}_contents" refid="@{dto-dir}_dtos" pathsep="${line.separator}"> 
       <chainedmapper> 
        <flattenmapper /> 
        <globmapper from="*.java" to="*" casesensitive="false" /> 
       </chainedmapper> 
      </pathconvert> 
      <echo file="${project.build.outputDirectory}/${@{dto-dir}}/jaxb.index" message="${@{dto-dir}_contents}" />        
     </sequential> 
    </for> 
</target> 

Io non sono un esperto formica con qualsiasi mezzo, come potete vedere, e ho dovuto fare alcune cose strane per creare nomi di proprietà uniche, ma funziona per me.

Problemi correlati