我已使用AbstractMojo创建了一个Maven插件,并且我试图对其进行测试。
我使用maven-plugin-testing-harness进行测试,但我在为插件参数注入值方面遇到了问题。
我有以下用于测试的pom.xml文件(src/test/resources/pom.xml
):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.vodori.pepper.docker.vm.unit</groupId>
<artifactId>test-pom</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Test VMStarter</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.vodori.common</groupId>
<artifactId>pepper-docker-vm</artifactId>
<version>1.0.1-SNAPSHOT</version>
<configuration>
<dockerSnapshotSite>pepper-demo-site</dockerSnapshotSite>
<dockerSnapshotVersion>3.6.11</dockerSnapshotVersion>
</configuration>
</plugin>
</plugins>
</build>
</project>
我的Mojo看起来像这样(在顶部):
public abstract class VMPlugin extends AbstractMojo {
/**
* Docker location
*/
@Parameter(required = true, property = "docker.path", defaultValue = "${env.DOCKER_LOCATION}")
String dockerPath;
public void setDockerPath(String dockerPath) {
this.dockerPath = dockerPath;
}
/**
* Docker VM Site name
*/
@Parameter(required = true, property = "docker.snapshot.site")
String dockerSnapshotSite;
/**
* Version of Docker snapshot
*/
@Parameter (required = true, property="docker.snapshot.version")
String dockerSnapshotVersion;
我使用@MojoRule方法进行测试,我的设置方法如下所示:
@Before
public void setUp() throws Exception {
vmStarter = (VMStarter) rule.lookupMojo( "start-docker-vm", "src/test/resources/pom.xml" );
assertNotNull(vmStarter);
}
我为我的一些测试用例(那些测试坏 docker位置的测试用例)使用setter,但是对于我的良好路径测试,我想依赖于环境变量DOCKER_LOCATION
填充。但是,出于某种原因,dockerPath
只是显示为null
。好像defaultValue
被忽略了。
我尝试将System.getEnv()
转储到STDERR上,我可以看到DOCKER_LOCATION
确实是设置。
我在这里缺少什么?为什么我的@Parameter
填充不正确?
答案 0 :(得分:1)
你从哪里获得语法defaultValue = "${env.DOCKER_LOCATION}"
?
env.*
是property和“您可以在pom.xml文件或Maven资源插件的过滤功能正在处理的任何资源中使用Maven属性。”
default-value
需要expression。
Guide to Developing Java Plugins, Introduction提到:“(更多信息可在”参数表达式“文档中找到)”。 但到目前为止我还没有找到这样的文件。 Thx @khmarbaise:org.apache.maven.plugin.PluginParameterExpressionEvaluator。
help:expressions
未向我的Maven 3.2.1显示${env}
。
虽然我的经验是,至少有一些(如果不是全部)链接文档不是最新的并且保留了最新的增强功能。
从程序逻辑的角度可能的解释:如果必须在程序范围之外设置默认值,则不能将其视为默认值。在Maven的意义上Convention Over Configuration。
编辑:添加了 Expressions API文档的链接。