作为方法的结果,如何在Maven插件中设置@Parameter的defaultValue?

时间:2016-03-28 15:01:15

标签: java maven maven-3 maven-plugin

我正在开发一个用于创建自定义包装类型的自定义maven插件。 我有它工作,可以我需要的格式构建zip文件。 但是,我注意到一些配置元素和变量取决于zip文件的名称。

zip文件有一个特殊的清单文件作为其格式的一部分。我希望参数 componentName 是正确的@Parameter,以便其他属性可以通过${componentName}依赖它。

我想动态获取组件名称,而不是强迫我的用户在其他地方指定它。清单文件有时可以包含它。如果没有,${project.basedir}中通常会有另一个与该组件同名的文件。

我定义了private static final string getComponentName(File baseDir)来计算未提供组件名称时的组件名称。

然而

@Parameter(property = "componentName",
           defaultValue = getComponentName("${project.basedir}"))
protected String componentName;

不会使用ParseException: syntax error @[34,46] in file ...

进行编译

有没有办法根据我的需要配置它?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:2)

注释中的defaultValue不能成为一种方法,因为注入将设置默认值并在那里评估某种java代码。所以你必须走以下路径:

@Parameter ( defaultValue = "${project.basedir}", property="componentName")
private String componentName;

此外,如果你需要一个需要做一些事情的getter,你应该简单地将属性设为私有,并使用getter访问它,你可以在那里做你喜欢的补充事物。

defaultValue的值可以查找here,您可以在其中查看可以用作默认值的内容。此外,我建议不要在${project.basedir}中放置一些内容,因为所有打包的内容都应该放在src/main/...中,所以如果你的某些内容不属于你的包,那么它应该位于src/Supplemental/而不是......

答案 1 :(得分:0)

这可能有点过头了,不过,我找到了解决办法 我想让它成为一个默认值的属性,所以我可以使它更容易配置。包括一些依赖的配置属性。

该解决方案最终为我的插件init添加了一个新目标。它在初始化阶段运行。它设置了componentName的逻辑,然后运行一些额外的逻辑来设置其他依赖字段的属性,因此后期生命周期阶段目标仍然可以正常使用变量。

步骤:

componentName

中删除 defaultValue
@Parameter(property = "componentName")
protected String componentName;

定义目标:

@Mojo(name = "init", defaultPhase = LifecyclePhase.INITIALIZE)
public class InitMojo extends AbstractComponentMojo

要在生命周期中默认运行它,请将以下内容添加到 components.xml 文件中:

<initialize>
  org.ucmtwine:ucm-maven-plugin:init
</initialize>

init execute()进行处理并设置结果

public void execute() throws MojoExecutionException, MojoFailureException
{
  determineComponentName(); //logic to set componentName

  //set the property with the result //not sure which one is truly necessary
  project.getProperties().setProperty("componentName",       componentName);
  session.getUserProperties().setProperty("componentName",   componentName);
  session.getSystemProperties().setProperty("componentName", componentName);
  getLog().debug("Setting componentName: " + componentName);

  //force reset of the dependent variables
  if ( null == componentFileName || "${componentFileName}".equals(componentFileName) )
  {
     componentFileName = componentName + ".zip";
     project.getProperties().setProperty("componentFileName",       componentFileName);
     session.getUserProperties().setProperty("componentFileName",   componentFileName);
     session.getSystemProperties().setProperty("componentFileName", componentFileName);
     getLog().debug("Setting componentFileName: " + componentFileName);
  }

  // more variables get reset here
}