2012-06-21 11 views
15

Uso lo maven-resource-plugin per filtrare alcune risorse nel mio progetto di maven. Nel mio progetto principale ho:Configura la codifica per diversi tipi di file in Maven?

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

In un progetto sub Ho un test.properties di file che è una pianura java properties file con metodo di codifica predefinito = ISO-8859-1. Questo file contiene:

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

per assicurarsi che i filtri questo file correttamente Ho diviso l'esperto di risorse-plugin in esecuzioni separati ognuno con la codifica:

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

Questo sembra eccessivo e ho la sensazione che non sto usando il plugin correttamente o che questo problema dovrebbe essere gestito in un altro modo. Forse attenersi alla codifica di caratteri speciali direttamente nei file delle proprietà:

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

?

+0

hai pensato di scrivere il tuo plugin Maven per questo? (potrebbero esserci opzioni che usano il plugin ant ma è solo un'ipotesi) – wemu

+0

Sei sicuro di dover fare la sezione extra per i file delle proprietà? Ho pensato che è solo per il codice sorgente, mentre i file delle proprietà sono risorse e quindi nessun codice sorgente. – hennr

+0

'project.build.sourceEncoding' in realtà si applica a' maven-resources-plugin', vedere https://maven.apache.org/plugins/maven-resources-plugin/xref/org/apache/maven/plugin/resources/ ResourcesMojo.html # 69, il valore predefinito per 'encoding' è' project.build.sourceEncoding' –

risposta

2

Hai ragione che è necessario configurare le esecuzioni ... Si potrebbe ottenere via con due esecuzioni, piuttosto che i tre ti sembra di essere con se steste seguendo il layout directory standard, ma ti sembra di essere messa file da ${basedir}/before in ${basedir}/after quindi l'esecuzione predefinita di resources:resources associata all'aggiunta di più resources alla sezione build non funzionerà per te.

La codifica di file filtrati stata una svista nella specifica originale pom modello e sarà probabilmente fissato in qualche versione ancora imprecisato di Maven

4

La domanda è una risposta preziosa in sé, come a quanto pare la procedura complicata la author fornisce è l'unico modo per configurare diverse codifiche per vari tipi di file filtrati. L'esempio dato, tuttavia, è specifico per caso d'uso non standard dell'autore, e sorvola su alcuni importanti dettagli, senza la quale l'uso effettivo della esempio è pieno di trucchi:

  • Non è ovvio, ma nell'esempio dell'autore l'obiettivo di copia delle risorse predefinito resources è ancora abilitato e viene eseguito in aggiunta ai due obiettivi definiti!
  • Si noterà che l'autore ha utilizzato la fase di ciclo di vita generate-resources anziché il valore predefinito process-resources. Questo è un trucco per aggirare il primo punto sopra; impostando i due obiettivi copy-resources in una fase precedente del ciclo di vita, le risorse vengono copiate in base alle regole specificate e quindi quando l'obiettivo arriva lungo la copia della risorsa originale viene lasciato intatto, apparentemente perché l'impostazione overwrite è impostata su false. Ma sarebbe meglio disable altogether l'esecuzione default-resources.
  • L'autore fornisce una dichiarazione outputDirectory. Sarebbe naturale pensare che l'autore lo abbia fornito solo perché si desiderava una directory di output personalizzata; dopotutto, l'obiettivo resources fornisce un valore predefinito per questa impostazione. Stranamente, però, per l'obiettivo copy-resources questa impostazione è effettivamente necessaria! C'è una variabile Maven standard ${project.build.outputDirectory} che può essere usata come valore, tuttavia.

Basandosi sull'esempio dell'autore nella domanda, qui è un modo di incollare e incollare i file delle proprietà utilizzando ISO-8859-1, copiare altri file senza filtrare e impedire che si verifichi la copia predefinita delle risorse ; tutti utilizzano le directory standard di origine e di destinazione:

<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

Grazie per questo feedback! Una domanda: come funziona insieme con le risorse e le opzioni di filtro definite sotto build.resources risp. build.testResources? Devo configurare entrambi o solo la configurazione del plugin? – Puce

Problemi correlati