2010-08-16 4 views
5

Tengo una aplicación experta que tiene este aspectoMaven incluyen contenidos de los archivos de un módulo en otra

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

file.xml debería ser así

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

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

</workflow> 

Quiero incluir el contenido de file_snippet .xml de module2 y module2 en file.xml de module3 antes de la compilación. ¿Es eso posible en maven? ¿Existe algún tipo de lenguaje de plantillas o complemento que pueda usar?

Respuesta

1

Me gustaría saber sobre algún motor de plantilla para maven también, pero tal vez no necesites maven al principio para eso.

Hay una manera de incluir otro archivo XML en un archivo 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> 

otra cosa, para la fusión de recursos XML entre dependencias/módulos en experto, puede utilizar Maven-sombra-plugin (con el transformador de recursos).

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

para fusionar módulo 1/src/main/resources/file.xml y modulo2/src/main/resources/file.xml (dependiendo de dependencias) en Module3/src /main/resources/file.xml.

2

Esto no es fácil, hay dos partes que debe implementar.

  1. obtener los fragmentos del otro módulo
  2. montar el archivo XML mediante el incluir

de 1. puede utilizar el 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> 

Ahora que ha copiado todos los fragmentos de module1.jar/snippets y module2.jar/snippets a target/snippets (esta fue la parte más fácil).

Por 2. Usted tiene que escoger a template engine y crear una clase principal para armar su plantilla con ella, probablemente mediante el exec:java mojo algo como esto:

<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, tiendo a utilizar en lugar de GMaven ejecutivo: java, ya que puedes escribir scripts groovy en línea sin crear clases java personalizadas)

Cuestiones relacionadas