2012-06-21 71 views
15

我使用maven-resource-plugin來過濾我的maven項目中的一些資源。在我父項目我有:在maven中配置不同文件類型的編碼?

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

在一個次級項目中,我有一個test.properties文件,該文件是一個純java properties file默認編碼= ISO-8859-1。該文件包含:

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

要正確確保該文件過濾器我已在Maven的資源插件分成單獨處決各有其編碼:

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

這種矯枉過正,似乎和我有一種感覺我要麼沒有正確使用插件,要麼以另一種方式處理這個問題。也許堅持直接在屬性文件中編碼特殊字符:

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

+0

您是否考慮編寫自己的maven插件? (可能有使用螞蟻插件的選項,但這只是一個猜測) – wemu

+0

你確定你必須爲屬性文件做額外的部分? 我認爲僅用於源代碼,而屬性文件是資源,因此沒有源代碼。 – hennr

+0

'project.build.sourceEncoding'實際上適用於'maven-resources-plugin',請參閱https://maven.apache.org/plugins/maven-resources-plugin/xref/org/apache/maven/plugin/resources/ ResourcesMojo.html#69,'encoding'的默認值是'project.build.sourceEncoding' –

回答

2

你是對的,你必須配置執行......你可以擺脫兩個執行,而你似乎使用三個,如果你遵循標準的目錄佈局,但你似乎把文件從${basedir}/before${basedir}/after因此resources:resources的默認執行加上多個resourcesbuild部分將不適用於您。

過濾文件的編碼是在原有pom型號規格的監督,將有可能被固定在Maven的

4

的問題本身就是一種寶貴的答案的一些至今尚未清楚的版本,顯然是複雜的過程作者提供的是爲各種過濾文件類型配置不同編碼的唯一方法。給出的例子,但是,具體到作者的不規範使用情況,並掩蓋了一些重要的細節,沒有這些例子的實際使用充滿了陷阱:

  • 這並不明顯,但在作者的示例中,默認資源複製目標resources仍處於啓用狀態並且除了兩個定義的目標之外還運行!
  • 您會注意到作者使用生命週期階段generate-resources而不是默認process-resources。這是擺脫上面第一點的一個竅門;通過使兩個copy-resources目標在較早的生命週期階段發生,資源按照給定規則進行復制,然後當目標出現時,原始資源複製保持不變,顯然是因爲其overwrite設置默認爲false。但是,執行disable altogetherdefault-resources會更好。
  • 作者提供了outputDirectory聲明。認爲作者只提供這一點是自然的,因爲需要自定義輸出目錄;畢竟,resources目標爲此設置提供了默認值。奇怪的是,對於copy-resources目標,這個設置實際上是必需的!但是,有一個標準的Maven變量${project.build.outputDirectory}可以用作值。在這個問題筆者自己的例子

大廈,這裏是一個剪切和粘貼的方式使用ISO-8859-1過濾屬性文件,複製其他文件,無需過濾,防止默認資源複製發生;所有使用標準的源和目標目錄:

<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

感謝您的反饋!一個問題:這與如何在build.resources和resp下定義的資源和過濾選項一起工作。 build.testResources?我必須配置兩者還是僅配置插件配置? – Puce

相關問題