我希望能够从我的原型生成一个项目,其中其中一个属性默认为空,或者如果在命令行中指定则填充。
这是我的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}
可以这样做,因为它永远不会是空的。但是,分类器默认情况下应为空。
答案 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
(其默认值),为空总结:
调用
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。