Maven插件:将所有可用属性传递给插值器

时间:2013-04-24 20:03:30

标签: maven maven-plugin

在Maven插件中,我想通过ValueSource使用内插器中通常可用于pom的所有属性。

我可以使用MavenProject#getProperties(),MavenSession#getProperties()或MavenProject#getModel()#getProperties之一访问pom,系统属性和环境变量属性中定义的属性。这适用于以下代码:

import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;

ValueSource valueSource = new PropertiesBasedValueSource( project.getModel()
                   .getProperties() )

但是,project.versionproject.build.directory等标准项目属性不属于任何这些属性实例。如何在属性实例中一次性获取所有这些内容?

我的插件使用Maven 2.2.1或3.0.3在generate-sources阶段运行。

1 个答案:

答案 0 :(得分:2)

回答我自己的问题: - ):

我想在过滤器中正常传递所有可用的属性。虽然我可以将每个属性设置为我的插件的参数,但是该解决方案需要修改插件源代码并在新属性添加到每个属性时重新编译它。此外,mojo的源代码将增长到很多行。

在过滤器中使用时,project.*属性实际上不是通过Project#getProperties方法可用的属性。相反,它们直接映射到项目对象本身的getter方法。这样做的类是PrefixedObjectValueSource在与PropertiesBasedValueSource相同的插值包中。它会将每个getter方法(bean属性)映射到一个属性,在其前面加上一个已定义的字符串,并递归地公开每个属性的bean属性。

  import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
  import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;

  ValueSource allProperties = new PropertiesBasedValueSource( getProject().getModel()
                   .getProperties() );
  ValueSource projectProperties =
              new PrefixedObjectValueSource( "project.", getProject() ) );