通过 Maven 生成 UUID

9
我需要在maven pom.xml文件中设置一个属性,该属性应为UUID。有人能告诉我如何将属性设置为UUID的最佳方法吗?我正在使用一个启动gigaspaces的配置文件,而gigaspaces需要组名,我希望它是唯一的(uuid)。因此,在我的配置文件中,我想设置一个groupName属性值,每次构建都应更改。由于我没有找到任何插件,因此我自己编写了一个UUIDGenerator插件。所以,我正在寻找如何实现这一点?编写插件是否是更好的选择,还是有更简单的选择?谢谢,Shekhar

只用了三秒钟就在谷歌上找到了,如果这个答案被点赞,我会感到很不舒服。但是这里有一个很好的方法:http://johannburkard.de/software/uuid/ - David Titarenco
1
@David 这个链接展示了如何添加生成 UUID 的库,但我猜 OP 需要在 pom 文件中设置 UUID。@Shekhar 如果我错了请纠正我。 - jmj
你想要实现什么?最简单的方法是通过命令行加载它:mvn build "-Dcommand.line.prop=hello again",然后你可以像这样使用它:line.prop=${command.line.prop} - amra
是的,org.life.java,你是正确的。@ David,我不知道为什么你认为人们不能使用谷歌。如果问题不清楚,请问。 - Shekhar
@pascal @ org.life.java 我已经详细阐述了我的问题,请回复。 - Shekhar
显示剩余4条评论
3个回答

9
Arian的solution(实现一个Maven插件)在我看来是实现您要求的干净方式(+1为他的答案)。
但是,如果您不打算在其他地方重复使用插件,则可以使用GMavenPlus插件快速替代。以下示例显示如何使用库中的Java类生成一些UUID并将其设置为属性:
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.stackoverflow</groupId>
  <artifactId>Q3984794</artifactId>
  <version>1.0-SNAPSHOT</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.safehaus.jug</groupId>
        <artifactId>jug</artifactId>
        <version>2.0.0</version>
        <!-- the classifer is important!! -->
        <classifier>lgpl</classifier>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    ...
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.gmaven</groupId>
        <artifactId>gmaven-plugin</artifactId>
        <version>1.3</version>
        <executions>
          <execution>
            <id>set-custom-property</id>
            <phase>initialize</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <classpath>
                <element>
                  <groupId>org.safehaus.jug</groupId>
                  <artifactId>jug</artifactId>
                  <classifier>lgpl</classifier>
                </element>
              </classpath>
              <source>
                import org.safehaus.uuid.UUIDGenerator
                def uuid = UUIDGenerator.getInstance().generateRandomBasedUUID()
                project.properties.setProperty('groupName', uuid.toString())
              </source>
            </configuration>
          </execution>
          <execution>
            <id>show-custom-property</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <source>
                def props = project.properties
                props.each {key, value -&gt; println key + "=" + value}
              </source>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

只需将插件绑定到 gigaspaces 之前的阶段即可。

第二次执行仅用于演示目的(显示属性):

$ mvn generate-resources 
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Q3984794 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- gmaven-plugin:1.3:execute (set-custom-property) @ Q3984794 ---
[INFO] 
[INFO] --- gmaven-plugin:1.3:execute (show-custom-property) @ Q3984794 ---
downloadSources=true
downloadJavadocs=true
project.reporting.outputEncoding=UTF-8
project.build.sourceEncoding=UTF-8
groupName=814ff1a5-a102-426e-875c-3c40bd85b737
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...

7
首先,如果您的设置需要称为“组名”的东西,那么您可能应该提供有意义的值。如果它必须是唯一的,您可以附加一些生成的字符,例如“MyApplication-10937410”。对我来说,使用UUID就像用大锤砸坚果一样。但这与您实际的问题无关,因此这里是我提出的解决方案:
如果您尚未这样做,请创建一个Maven插件(有一个原型)。添加此依赖项:
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.2.1</version>
    </dependency>

这是您的MOJO应该如何看起来的样子:
/**
 * Goal which generates a group name.
 *
 * @goal generate
 * @phase initialize
 */
public class GroupNameGeneratorMojo extends AbstractMojo {

    /**
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;

    @Override
    public void execute() throws MojoExecutionException {
        String groupName = ... ;
        project.getProperties().setProperty("uniqueGroupName", groupName);
    }

}

在您的实际项目pom中,无论何时需要它,请使用${uniqueGroupName}并像这样配置插件。
<build>
    <plugins>
        <plugin>
            <groupId>the.plugin.groupid</groupId>
            <artifactId>groupNameGenerator</artifactId>
            <executions>
                <execution>
                    <goals><goal>generate</goal></goals>
                </execution>
            </executions>
        <plugin>

1

有一个https://github.com/stevespringett/maven-uuid-generator,它公开了一个UUID用于构建,如${project.build.uuid}。您可以像这样使用它

<plugins>
    <plugin>
        <groupId>us.springett</groupId>
        <artifactId>maven-uuid-generator</artifactId>
        <version>1.0.1</version>
        <executions>
            <execution>
                <phase>initialize</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接