我正在创建一个拥有大量自定义属性的maven原型。
例如:
<requiredProperties>
<requiredProperty key="db-name">
<defaultValue>Some db-name</defaultValue>
</requiredProperty>
<requiredProperty key="station-name">
<defaultValue>localhost</defaultValue>
</requiredProperty>
...
</requiredProperties>
当基于此原型生成新项目时,maven知道一些默认变量,如groupId,artifactId,version。 maven是否知道其他微不足道的变量,如env.user,user,host,path,basedir或其他任何变量? 哪个是? 我怎么能得到它们?
感谢。
答案 0 :(得分:2)
我意识到这是一个古老的问题,但我早些时候遇到过这个问题而且还投票了。我想知道同样的问题,我现在想出了一个解决方案/解决方法来启用对这些属性的访问。
我创建了自己的Maven插件,名为property-setter-maven-plugin
,设置了System,最重要的是 execution 属性。此插件的配置允许指定任意数量的属性和值(因为它们在POM中定义,可以访问所有常规变量)。当然后运行archetype插件(在与我的自定义插件相同的Maven执行中)时,它会读取执行属性并找到您已配置的任何属性。
我的Maven命令看起来像这样:
mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...
POM中与生成原型相同的目录中的配置如下所示:
...
<plugin>
<groupId>com.example.build.maven</groupId>
<artifactId>property-setter-maven-plugin</artifactId>
<version>0.1</version>
<executions>
<execution>
<goals><goal>set-properties</goal></goals>
<configuration>
<version>${project.version}</version>
<userName>${user.name}</userName>
</configuration>
</execution>
</executions>
</plugin>
...
可以修改为只设置所有系统属性的插件代码如下:
package com.example.build.maven.mojo;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import java.util.Properties;
/**
* PropertySetterMojo
*
* @goal set-properties
* @phase validate
* @since 0.1
*/
public class PropertySetterMojo extends AbstractMojo
{
/**
* @parameter default-value="${project}"
* @parameter required
* @readonly
*/
private MavenProject project;
/**
* @parameter expression="${session}"
* @readonly
*/
private MavenSession session;
/**
* @parameter expression="${mojoExecution}"
* @readonly
* @required
*/
protected MojoExecution execution;
/**
*
*/
@Override
public void execute() throws MojoExecutionException, MojoFailureException
{
try
{
Plugin plugin = execution.getPlugin();
String executionId = execution.getExecutionId();
PluginExecution pluginExecution = plugin.getExecutionsAsMap().get(executionId);
Xpp3Dom config = ((Xpp3Dom) pluginExecution.getConfiguration());
Properties executionProperties = session.getExecutionProperties();
for (int i = 0; i < config.getChildCount(); i++)
{
Xpp3Dom configEntry = config.getChild(i);
String propertyName = configEntry.getName();
String propertyValue = configEntry.getValue();
System.setProperty(propertyName, propertyValue);
executionProperties.setProperty(propertyName, propertyValue);
getLog().info("Set System and execution property: " + propertyName + " => " + propertyValue);
}
}
catch (Exception e)
{
throw new MojoExecutionException("Failed to set properties", e);
}
}
}
答案 1 :(得分:0)
此链接包含Maven原型的内置属性列表 - http://intellectualcramps.wordpress.com/2011/04/15/maven-archetype-creation-tips/
内置属性是:
答案 2 :(得分:0)
除了Daniel Stolz回答,这里链接到Maven Archetype Specification页面: http://maven.apache.org/archetype/maven-archetype-plugin/specification/archetype-metadata.html
摘自规范,突出显示属性名称:
[...]
Velocity引擎在项目文件生成期间使用的主要属性是 groupId,artifactId,version和package 。
可以定义在生成文件之前必须重要的其他属性。
[...]