2016-08-22 54 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