2010-08-16 7 views
5

Ho un'applicazione Maven che assomiglia a questoMaven includono il contenuto dei file da un modulo in un altro

application_name/ 
    module1 
     src/main/resources 
      file_snippet.xml 
    module2 
     src/main/resources 
      file_snippet.xml 
    module3 
     src/main/resources 
      file.xml 

file.xml dovrebbe essere così

<workflow> 
    <action> 
    <%= module1/src/main/resources/file_snippet.xml %> 
    </action> 

    <action> 
    <%= module2/src/main/resources/file_snippet.xml %> 
    </action> 

</workflow> 

voglio includere il contenuto di file_snippet .xml da module2 e module2 in file.xml di module3 prima della build. È possibile in Maven? C'è una sorta di lingua dei modelli o plugin che posso usare?

risposta

1

Mi piacerebbe sapere qualche motore di template anche per Maven, ma forse non hai bisogno di Maven all'inizio per quello.

C'è un modo per includere un altro file XML in un file xml: http://bobcat.webappcabaret.net/javachina/faq/xml_01.htm#dtd_Q408

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [ 
    <!ENTITY xmlfrag SYSTEM "xmlfrag.txt" > 

    <!ELEMENT root (tag1, tag2) > 
    <!ELEMENT tag1 (childtag) > 
    <!ELEMENT tag2 (childtag) > 
    <!ELEMENT childtag (#PCDATA) > 
    <!ATTLIST childtag att NMTOKEN #REQUIRED > 
]> 
<root> 
    &xmlfrag; 
</root> 

xmlfrag.txt(well formed xml fragment without xml decl) 

<tag1> 
    <childtag att="child1">text1</childtag> 
</tag1> 
<tag2> 
    <childtag att="child2">text2</childtag> 
</tag2> 

altro, per unire risorse XML tra dipendenze/moduli in Maven, è possibile utilizzare Maven-ombra-plugin (con il trasformatore di risorse).

Nel tuo caso:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.4</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
        <resource>file.xml</resource> 
        <!-- Add this to enable loading of DTDs 
        <ignoreDtd>false</ignoreDtd> 
        --> 
       </transformer> 
       </transformers> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

per unire module1/src/main/risorse/file.xml e module2/src/main/risorse/file.xml (a seconda delle dipendenze) in module3/src /main/resources/file.xml.

2

Questo non è facile, ci sono due parti che è necessario implementare.

  1. ottenere i frammenti dal l'altro modulo
  2. assemblare il file XML utilizzando il includere

per 1. è possibile utilizzare il dependency:unpack mojo:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>unpack</id> 
      <phase>initialize</phase> 
      <goals> 
      <goal>unpack</goal> 
      </goals> 
      <configuration> 
      <outputDirectory>${project.build.directory}/snippets</outputDirectory> 
      <includes>snippets/*.xml</includes> 
      <artifactItems> 
       <artifactItem> 
       <groupId>your.app</groupId> 
       <artifactId>module1</artifactId> 
       <version>${project.version}</version> 
       <type>jar</type> 
       </artifactItem> 
       <artifactItem> 
       <groupId>your.app</groupId> 
       <artifactId>module2</artifactId> 
       <version>${project.version}</version> 
       <type>jar</type> 
       </artifactItem> 
      </artifactItems> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

Ora avete copiato tutti i frammenti di module1.jar/snippet e module2.jar/snippet per target/snippet (questa era la parte più semplice).

Per 2. è necessario raccogliere a template engine e creare una classe principale di assemblare il modello con esso, probabilmente utilizzando il exec:java mojo qualcosa di simile:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.1</version> 
    <executions> 
     <execution> 
     <goals> 
      <goal>java</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>com.yourcompany.YourTemplateParser</mainClass> 
     <arguments> 
     <argument>path/to/your/template</argument> 
     <argument>path/to/the/snippets/folder</argument> 
     <argument>target/path</argument> 
     </arguments> 
    </configuration> 
    </plugin> 

(Personalmente, tendo a usare al posto di GMaven exec: java, come è possibile scrivere inline groovy scripts senza creare classi java personalizzate)

Problemi correlati