Maven archetype - 可选属性,默认为空

时间:2016-08-08 13:57:16

标签: maven maven-3 pom.xml maven-archetype

我希望能够从我的原型生成一个项目,其中其中一个属性默认为空,或者如果在命令行中指定则填充。

这是我的archetype-metadata.xml

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="basic">
    <requiredProperties>
        <requiredProperty key="compilerVersion"/>
        <requiredProperty key="dependencyClassifier">
            <defaultValue></defaultValue>
        </requiredProperty>
    </requiredProperties>
</archetype-descriptor>

这不起作用。如果dependencyClassifier中有任何非空白值,那么它可以完美地运行。但是,我无法使用默认值为“empty”。

defaultValue为空/ null时得到的错误是:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:generate (default-cli) on project standalone-pom: Archetype com.avast.archetype:compile-java:1.0.21 is not configured
[ERROR] Property dependencyClassifier is missing.
[ERROR] -> [Help 1]

或者,我接受能够在命令行上传递空值(或“空格”值)。同样,使用"-DdependencyClassifier= "不起作用。

默认情况下,如何指定属性应为空?

由于

我想要实现的是能够从原型创建一个项目,其中包含一个依赖声明:

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>artifact</artifactId>
            <version>${dependencyVersion}</version>
            <classifier>${dependencyClassifier}</classifier>
        </dependency>
    </dependencies>

我需要能够在原型创建上实例化${dependencyClassifier}${dependencyVersion}可以这样做,因为它永远不会是空的。但是,分类器默认情况下应为空。

2 个答案:

答案 0 :(得分:3)

这就是我成功满足您的要求的方式:

在要生成的Maven项目的模板pom.xml文件中,放置一个空属性,但不要将其用作classifier值的占位符,在那里您仍然会使用原型requiredProperty占位符如下:

<properties>
    <!-- empty placeholder, document it accordingly -->
    <empty.property></empty.property>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
        <classifier>${dependencyClassifier}</classifier>
    </dependency>
</dependencies>

然后,在archetype-metadata.xml中有以下内容:

<requiredProperties>
    <requiredProperty key="dependencyClassifier">
        <defaultValue>${empty.property}</defaultValue>
    </requiredProperty>
</requiredProperties>

注意匹配:

  • 这里的${empty.property}默认值只是Archetype插件的一个非现有属性,它被接受(空值无效)。
  • dependencyClassifier现在有一个默认值,即${empty.property}
  • 在生成的项目中,empty.property将为空(如果在dependencyClassifier调用期间未指定mvn archetype:generate),因为它作为Maven属性存在,具有空值,这使得整个对Maven有效:原型注入的属性值是最终pom中的声明属性,因此不会破坏任何内容。
  • 因此,分类器将具有dependencyClassifier值(在运行时指定)或empty.property(其默认值),为空
  • Maven将空分类器视为无分类器,因此为我们提供了两种行为。

总结:

调用

mvn archetype:generate ... -DdependencyClassifier=something

会在运行时使用classifier(我们想要的分类器)有效地填充something元素。

相反,未指定任何值会使classifier留下${empty.property},即为空。 Maven不会寻找任何分类器(也不会抱怨)。

这种方法的唯一缺点就是保留empty.property属性,在最终的pom.xml中没有多大意义,这可能会让一些纯粹主义者感到震惊,但却能胜任。< / p>

答案 1 :(得分:1)

我有一个类似的案例,并应用于您的用例,它是这样解决的:

archetype-metadata.xml中,将_UNDEFINED_(或其他魔术字符串)定义为默认值:

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="basic">
  <requiredProperties>
    <requiredProperty key="compilerVersion"/>
    <requiredProperty key="dependencyClassifier">
      <defaultValue>_UNDEFINED_</defaultValue>
    </requiredProperty>
  </requiredProperties>
</archetype-descriptor>

在模板<dependency>的{​​{1}}部分中,使用VTL pom.xml指令:

#if

因此,如果您省略<dependencies> <dependency> <groupId>com.example</groupId> <artifactId>artifact</artifactId> <version>${dependencyVersion}</version> #if( ${dependencyClassifier} != "_UNDEFINED_" ) <classifier>${dependencyClassifier}</classifier> #end </dependency> </dependencies> pom.xml,则最终的<classifier>就根本不包含-DdependencyClassifier=something定义 。我想绝对是令纯粹主义者满意的东西。即使原型中的代码本身可能没有。

注意:根据dependency list of archetype-common,当前的Maven原型插件版本3.1.2使用Apache Velocity Engine 1.7