2012-06-21 15 views
15

Uso el maven-resource-plugin para filtrar algunos recursos en mi proyecto de maven. En mi proyecto principal que tengo:¿Configurar la codificación para diferentes tipos de archivos en maven?

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

en un proyecto sub Tengo un archivo test.properties que es una llanura java properties file con codificación por defecto = ISO-8859-1. Este archivo contiene:

aboutText=Version ${project.version} © 2012 blabla 

para fabricar filtros de este archivo seguro correctamente He dividido el experto en recursos-plugin en ejecuciones separadas, cada una con su codificación:

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <configuration> 
     <nonFilteredFileExtensions> 
     <nonFilteredFileExtension>ico</nonFilteredFileExtension> 
     <nonFilteredFileExtension>jar</nonFilteredFileExtension> 
     </nonFilteredFileExtensions> 
    </configuration> 
    <executions> 
     <execution> 
     <id>filter-properties-files</id> 
     <phase>generate-resources</phase> 
     <goals> 
      <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
      <!-- java properties files are encoded in ISO-8859-1 so when 
      filtering those files we stick with that encoding. --> 
      <encoding>ISO-8859-1</encoding> 
      <outputDirectory>${basedir}/after</outputDirectory> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>${basedir}/before</directory> 
       <includes> 
       <include>**/*.properties</include> 
       </includes> 
      </resource> 
      </resources> 
     </configuration> 
     </execution> 
     <execution> 
     <id>filter-non-properties-files</id> 
     <phase>generate-resources</phase> 
     <goals> 
      <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
      <encoding>${project.build.sourceEncoding}</encoding> 
      <outputDirectory>${basedir}/after</outputDirectory> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>${basedir}/before</directory> 
       <includes> 
       <include>**/*.product</include> 
       <include>**/*.inf</include> 
       </includes> 
      </resource> 
      </resources> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Esto parece una exageración y tengo una sensación que no estoy usando el plugin correctamente o que este problema debe manejarse de otra manera. Tal vez se adhieren a la codificación de caracteres especiales en los archivos de propiedades directamente:

aboutText=Version ${project.version} \u00a9 2012 blabla 

?

+0

¿Consideró que debe escribir su propio plugin maven para esto? (puede haber opciones usando el plugin ant pero eso es solo una suposición) – wemu

+0

¿Está seguro de que tiene que hacer la sección adicional para los archivos de propiedades? Pensé es solo para el código fuente, mientras que los archivos de propiedades son recursos y, por lo tanto, no hay código fuente. – hennr

+0

'project.build.sourceEncoding' en realidad se aplica a' maven-resources-plugin', ver https://maven.apache.org/plugins/maven-resources-plugin/xref/org/apache/maven/plugin/resources/ ResourcesMojo.html # 69, el valor predeterminado para 'encoding' es' project.build.sourceEncoding' –

Respuesta

2

Tienes razón en que tienes que configurar las ejecuciones ... Podrías salirte con la tuya con dos ejecuciones en lugar de las tres que pareces estar usando si estuvieras siguiendo el diseño de directorio estándar pero pareces poner archivos de ${basedir}/before en ${basedir}/after por lo que la ejecución predeterminada de resources:resources junto con la adición de resources a la sección build no funcionará para usted.

La codificación de archivos filtrados fue un descuido en la especificación pom modelo original y es probable que se fija en alguna versión aún no especificado de Maven

4

La pregunta es una respuesta muy valiosa en sí misma, ya que al parecer el procedimiento complicado de la autor proporciona es la única forma de configurar diferentes codificaciones para varios tipos de archivos filtrados. El ejemplo dado, sin embargo, es específico para casos de uso no estándar del autor, y pasa por alto algunos detalles importantes, sin los cuales el uso real del ejemplo está plagado de trampas:

  • No es obvio, pero en el ejemplo del autor , el objetivo predeterminado de copia de recursos resources sigue habilitado y se ejecuta además de los dos objetivos definidos.
  • Observará que el autor utilizó la fase del ciclo de vida generate-resources en lugar de la predeterminada process-resources. Este es un truco para sortear el primer punto anterior; al hacer que los dos objetivos copy-resources ocurran en una fase de ciclo de vida anterior, los recursos se copian de acuerdo con las reglas dadas, y cuando aparece el objetivo default-resources, la copia de recursos original permanece intacta, aparentemente porque su configuración overwrite predeterminada es false. Pero sería mejor que disable altogether la ejecución default-resources.
  • El autor proporciona una declaración outputDirectory. Sería natural pensar que el autor solo proporcionó esto porque se deseaba un directorio de salida personalizado; después de todo, el objetivo resources proporciona un valor predeterminado para esta configuración. Extrañamente, sin embargo, para el objetivo copy-resources, esta configuración es realmente necesaria. Sin embargo, hay una variable Maven estándar ${project.build.outputDirectory} que se puede usar como valor.

Sobre la base del ejemplo del autor en la pregunta, aquí hay una forma de cortar y pegar para filtrar archivos de propiedades usando ISO-8859-1, copiar otros archivos sin filtrar e impedir que se produzca la copia de recursos predeterminada ; todos utilizando los directorios de origen y destino estándar:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.7</version> 
    <executions> 
    <execution> 
     <!-- Turn off default resource copying --> 
     <id>default-resources</id> 
     <phase /> 
    </execution> 
    <execution> 
     <!-- Filter resources in properties files. --> 
     <id>filter-properties-files</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <encoding>ISO-8859-1</encoding> 
     <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.properties</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    <execution> 
     <!-- Do not do property substitution in files that are not properties files, such as binary files. --> 
     <id>copy-other-resources</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>false</filtering> 
      <excludes> 
       <exclude>**/*.properties</exclude> 
      </excludes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

¡Gracias por este comentario! Una pregunta: ¿Cómo funciona esto junto con los recursos y las opciones de filtrado definidas en build.resources resp. build.testResources? ¿Tengo que configurar ambos o solo la configuración del complemento? – Puce

Cuestiones relacionadas