如何在maven插件中将@parameter的defaultvalue设置为方法的结果?

cwxwcias  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(360)

我正在开发一个定制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 ... 有没有办法把它配置成我想要的?如果是,怎么做?

j8yoct9x

j8yoct9x1#

注解中的defaultvalue不能是方法,因为注入将设置默认值并在那里计算某种java代码..因此您必须走以下路径:

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

此外,如果您需要一个getter,它需要执行一些操作,那么您应该像我一样简单地将属性设置为private,并使用getter来访问它,在那里您可以执行您喜欢的补充操作。。
的值 defaultValue 可以在这里查找,您可以看到可以用作默认值的内容。此外,我建议不要把东西放在 ${project.basedir} 因为所有要打包的东西都应该放在 src/main/... 因此,如果你有一些东西,将不会是你的包的一部分,它应该被定位 src/Supplemental/ 相反。。。

7z5jn7bk

7z5jn7bk2#

可能是杀伤力太大了,不过,我想出了一个解决办法。
我想让它成为一个带有默认值的属性,这样我就可以更容易地配置它。包括一些相关的配置属性。
解决方案是给我的插件添加一个新的目标 init . 它在初始化阶段运行。它按逻辑设置 componentName 然后运行一些附加逻辑来设置附加依赖字段的属性,这样以后的生命周期阶段目标仍然可以正常使用变量。

步骤:

从中删除defaultvalue componentName ```
@Parameter(property = "componentName")
protected String componentName;

确定目标:

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

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

//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
}

相关问题