Maven 原型 - 可选属性,默认为空

Mar*_*lka 4 pom.xml maven-3 maven 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>
Run Code Online (Sandbox Code Playgroud)

这是行不通的。如果 中有任何非空白值dependencyClassifier,则它可以完美运行。但是,我无法让它在默认值为“空”的情况下工作。

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

[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]
Run Code Online (Sandbox Code Playgroud)

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

如何指定属性默认为空?

谢谢


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

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>artifact</artifactId>
            <version>${dependencyVersion}</version>
            <classifier>${dependencyClassifier}</classifier>
        </dependency>
    </dependencies>
Run Code Online (Sandbox Code Playgroud)

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

A_D*_*teo 5

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

pom.xml待生成Maven项目的模板文件中,放置一个空属性,但不要将其用作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>
Run Code Online (Sandbox Code Playgroud)

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

<requiredProperties>
    <requiredProperty key="dependencyClassifier">
        <defaultValue>${empty.property}</defaultValue>
    </requiredProperty>
</requiredProperties>
Run Code Online (Sandbox Code Playgroud)

注意匹配:

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

总结一下:

调用

mvn archetype:generate ... -DdependencyClassifier=something
Run Code Online (Sandbox Code Playgroud)

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

相反,不指定任何值将保留classifier${empty.property},那就是空。Maven 不会寻找任何分类器(也不会抱怨)。

这种方法的唯一缺点是empty.property在你的 final 中保留一个没有太大意义的属性pom.xml,这是一个可能会让一些纯粹主义者感到震惊的技巧,但可以完成工作。


msa*_*msa 5

我有一个类似的案例,并将其应用于您的用例,如下解决:

在 中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>
Run Code Online (Sandbox Code Playgroud)

<dependency>模板部分中pom.xml,使用VTL #if指令:

<dependencies>
  <dependency>
    <groupId>com.example</groupId>
    <artifactId>artifact</artifactId>
    <version>${dependencyVersion}</version>
#if( ${dependencyClassifier} != "_UNDEFINED_" )
    <classifier>${dependencyClassifier}</classifier>
#end
  </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

因此,如果您省略with ,您的 Final根本pom.xml不包含<classifier>定义。我想这绝对能让纯粹主义者满意。即使原型中的代码本身也可能不是。-DdependencyClassifier=somethingarchetype:generate

注意:根据archetype-common 的依赖列表,当前版本 3.1.2 的 Maven archetype 插件使用Apache Velocity Engine 1.7