2016-08-22 96 views
2

我創建了Maven原型。我META-INF/maven/archetype-metadata.xml看起來是這樣的:在Maven原型中更改包屬性

<archetype-descriptor xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"> 

    <fileSets> 
    <fileSet filtered="true" packaged="true" encoding="UTF-8" > 
     <directory>src/main/java</directory> 
    </fileSet> 
    </fileSets> 

</archetype-descriptor> 

這工作,因爲在它創建一個Java源文件夾,並把我的課在包被groupIdartifactId定義。

但是,我想修改他的包名稱。例如,如果我的groupId是com.example和我的artifactId wvdz,那麼我的包應該是:

com.example.wvdz.mypackage 

問題:我如何做到這一點?

+0

[ Maven - 創建一個rchetypes](https://maven.apache.org/guides/mini/guide-creating-archetypes.html)使用mvn archetype:generate? – abarisone

+0

也看看http://stackoverflow.com/questions/20403157/package-names-in-project-generated-from-maven-archetype – abarisone

回答

6

爲了實現您的目標,並且您已經在使用packaged屬性true(稍後解釋),您可以簡單地將目錄添加到下面的路徑中。

保持相同的配置,另外還有include元素如下:

<fileSets> 
    <fileSet filtered="true" packaged="true" encoding="UTF-8" > 
     <directory>src/main/java</directory> 
     <includes> 
      <include>**/*.java</include> 
     </includes>  
    </fileSet> 
</fileSets> 

然後,您可以將src/main/java/mypackage下Java源代碼模板所在的包語句應該如下:

package ${package}.mypackage 

注意.mypackage正好反映src/main/java下的mypackage文件夾。但是,在創建原型時,Maven將作爲一個文件夾(和一個包)一樣放置在$ {package}屬性值之間,默認情況下它是$ {groupId}。

您可以隨時通過-Dpackage屬性並將其覆蓋爲默認值(groupId),然後根據上述模板將其用作包的前綴。

發生這種情況的原因是上述fileSet部分中的packaged屬性設置爲true。在這種情況下,true意味着:添加由${package}屬性指定的文件夾層次結構。將其設置爲false將導致${package}被忽略,如果您確實想要對文件夾結構進行硬編碼並顯然將其反映到Java代碼的package語句中,則可以使用它以保持一致性。


行爲上面記錄在官方How is metadata about an archetype stored?

原型定義了一個單一的文件集:

  • 的文件集將採取一切文件archetype-resources/src/main/java匹配**/*.java圖案
  • 選定的文件將使用Velocity引擎生成(filtered=true
  • 這些文件將在生成的項目的src/main/java目錄中生成,該目錄與JAR文件所在的目錄相同,但是該目錄由package屬性預置。

並且:

文件集可以是packaged,這意味着將要生成的選擇的文件/在由包前綴屬性的目錄結構複製。它們可以是非打包的,這意味着所選文件將被生成/複製,而無需預先考慮。

在官方Archetype Descriptor Model中也可以找到相同的細節(約packaged屬性)。


另一種可能的解決方案是使用一個額外的屬性或直接在archetype-metadata.xml文件定義package屬性值如下:

<archetype-descriptor 
    xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"> 

    <fileSets> 
     <fileSet filtered="true" packaged="true" encoding="UTF-8"> 
      <directory>src/main/java</directory> 
     </fileSet> 
    </fileSets> 

    <requiredProperties> 
     <requiredProperty key="package"> 
      <defaultValue>${groupId}.${artifactId}.mypackage</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

</archetype-descriptor> 

注意新requiredProperties節:在這裏我們設置的默認值對於package屬性,不需要在運行時提供它(但可以覆蓋上面的值)。

因此,src/main/java下的Java源代碼模板(無需進一步靜態文件夾),簡直是:

package ${package} 

在創建(archetype:generate),那麼Maven會使用com.sample.something.mypackage作爲包值(在Java源文件),並使用值com/sample/something/mypackage(相同的屬性,但路徑格式)填充packageInPathFormat屬性,並創建期望的包層次結構,與Java源代碼預期放置的內容一致。

+0

沒有這些方法似乎爲我工作。在Java類中添加正確的程序包名稱是可行的,但是當我創建一個新項目時,該類不會放入相應的文件夾中 - 它仍然放在groupId.artifactId文件夾中 – wvdz

+0

@wvdz是否應用了相同的確切方法並重新輸入 - 在運行新的'mvn archetype:generate ...'之前,在你的機器上安裝了('mvn clean install')原型?兩種方法都適用於我。如上所述,您是否在'src/main/java'中創建了新文件夾? –

+0

我正在使用eclipse界面。爲了能夠在創建新項目時選擇原型,我使用Run As Maven Build ...和參數'clean install archetype:update-local-catalog'。這應該與在提示符上執行'mvn clean install archetype:update-local-catalog'相同。之後,我只是在創建一個新項目時選擇它。我添加了一個必需的屬性'包',並且默認值爲$ {package} .mypackage。 – wvdz