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},因为它永远不会为空。但是,默认情况下,分类器应为空。
这就是我成功满足您的要求的方式:
在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将是空的(如果dependencyClassifier在mvn archetype:generate调用期间未指定),因为它作为 Maven 属性存在,具有空值,这使得整个对 Maven 有效:原型注入的属性值是在最后的pom,因此不会破坏任何东西。dependencyClassifier值(在运行时指定)或empty.property(其默认值),该值为空总结一下:
调用
mvn archetype:generate ... -DdependencyClassifier=something
Run Code Online (Sandbox Code Playgroud)
将在运行时classifier使用something我们想要的分类器有效地填充元素。
相反,不指定任何值将保留classifier用${empty.property},那就是空。Maven 不会寻找任何分类器(也不会抱怨)。
这种方法的唯一缺点是empty.property在你的 final 中保留一个没有太大意义的属性pom.xml,这是一个可能会让一些纯粹主义者感到震惊的技巧,但可以完成工作。
我有一个类似的案例,并将其应用于您的用例,如下解决:
在 中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。
| 归档时间: |
|
| 查看次数: |
4723 次 |
| 最近记录: |