我正在开发一个用于创建自定义包装类型的自定义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 ...
有没有办法根据我的需要配置它?如果是这样,怎么样?
答案 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
@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
}