我正在开发一个定制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条答案
按热度按时间j8yoct9x1#
注解中的defaultvalue不能是方法,因为注入将设置默认值并在那里计算某种java代码..因此您必须走以下路径:
此外,如果您需要一个getter,它需要执行一些操作,那么您应该像我一样简单地将属性设置为private,并使用getter来访问它,在那里您可以执行您喜欢的补充操作。。
的值
defaultValue
可以在这里查找,您可以看到可以用作默认值的内容。此外,我建议不要把东西放在${project.basedir}
因为所有要打包的东西都应该放在src/main/...
因此,如果你有一些东西,将不会是你的包的一部分,它应该被定位src/Supplemental/
相反。。。7z5jn7bk2#
可能是杀伤力太大了,不过,我想出了一个解决办法。
我想让它成为一个带有默认值的属性,这样我就可以更容易地配置它。包括一些相关的配置属性。
解决方案是给我的插件添加一个新的目标
init
. 它在初始化阶段运行。它按逻辑设置componentName
然后运行一些附加逻辑来设置附加依赖字段的属性,这样以后的生命周期阶段目标仍然可以正常使用变量。步骤:
从中删除defaultvalue
componentName
```@Parameter(property = "componentName")
protected String componentName;
@Mojo(name = "init", defaultPhase = LifecyclePhase.INITIALIZE)
public class InitMojo extends AbstractComponentMojo
//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
}