Java文件中的Maven版本号

时间:2012-01-12 01:49:18

标签: java maven ant build m2eclipse

我来自ANT,您可以通过执行某种方法调用.java文件来获取版本号。我想在我的新pom.xml中做类似的事情来自动获取正确的版本号。我需要应用程序了解它自己的版本,同时Maven知道版本得到了正确的版本。持有版本信息加倍是没有选择的。

或者Maven可以在构建期间/之前创建一个新的.java文件吗?

我可以想出很多方法来实现这个目标,但是在Maven项目中有最好的实践方法吗?

5 个答案:

答案 0 :(得分:26)

在构建JAR时,Maven将pom.xmlpom.properties文件写入META-INF/maven/[group ID]/[artifact ID]目录。然后,您可以在应用程序中阅读其中一个版本。

或者,您可以使用resource filtering显式编写新的version.properties文件。

如果您将以下内容放入POM中:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

然后将version.properties模板放入src / main / resources目录中,如下所示:

version = ${project.version}

Maven将替换POM中读取的版本,然后您的应用程序只需阅读version.properties资源并查询version密钥。

答案 1 :(得分:1)

我将在SO:How to read an external properties file in Maven上推荐你参考这个帖子。特别是,请查看Dougnukem的答案,该答案描述了如何将外部属性文件读入Maven。您可以将其用作共享源,以控制Maven构建脚本和Java应用程序中的版本号。

答案 2 :(得分:1)

也许如果你详细说明这个要求,我们可以帮助更多地为你的问题提供更优雅的mavenish解决方案。 Nmely,这个第二个应用程序是什么,它是从Maven启动的,如果是这样的话,它在构建过程的哪个阶段启动了?这个应用程序和Maven有什么交互?

有很多方法可以实现,但选择正确主要取决于您的具体情况,您的问题中没有足够的信息可以深入挖掘更全面的解决方案。也就是说,以下是我的想法:

  • External properties:您可以在外部或直接从Maven构建过程创建属性文件。然后,您可以从其他应用程序中读取此属性文件。

  • 过滤:正如其他人所说,可以让Maven过滤资源文件。此文件可以是您插入当前版本号的java文件,并从您的其他应用程序调用此文件。

  • 从Maven构建中调用您的应用程序并传递参数:您可以使用exec插件并将您的应用程序作为Maven的子流程调用,传递当前版本号$ {project.version}。

  • Integrate您在Maven中构建的旧Ant:您可以直接调用一些Ant片段或从Maven完成Ant构建。这将为您提供一个混合构建系统,这可能不是最好的,但仍然可以让您在迁移过程中有一些余地,并管理较旧的Ant脚本,将一小部分功能迁移到Maven。并不是说两者混合在一起并不一定是坏事,只是Maven提供了许多Ant脚本可能干扰的硬连线或准硬连线配置约定。在这方面,两者都很难相处。

  • ant驱动您的Maven构建:您也可以执行相反的操作,即从ant驱动Maven构建过程,从而控制您如何调用其他系统。通过集成正确的东西(例如属性或过滤器),您可以确保Maven从特定项目中生成必要的工件,您可以在以后的Ant脚本中使用该工件。请注意,此任务的文档不是很精细,您可能需要调整一下才能使其工作,但至少您将处于熟悉的环境中。

如果没有关于这两个系统如何相互作用的更多信息以及为什么需要这些信息,那么很难为您深入挖掘。

希望这有帮助

答案 3 :(得分:0)

不清楚你指的是什么版本号,为什么它会出现在java文件中。 但是,如果您尝试为项目分配版本号,请遵循标准Maven约定。这是一个例子:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myco.abc</groupId>
  <artifactId>myapp</artifactId>
  <packaging>war</packaging>
  <version>1.0.0-SNAPSHOT</version>

  <name>My App</name>
  <description>My application description.</description>
  <url>http://myapp.myco.com</url>
....

答案 4 :(得分:0)

我意识到很久以前就已经回答了这个问题,但我对答案有了新的看法,有些人可能觉得有用。

我有一个replacer插件在每个MAVEN构建的Java文件中更改一个字符串。因此,如果pom.xml更新了pom项目版本号,它将自动反映在java源文件中。

关注replace目标:

<build>
    ...
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        com.google.code.maven-replacer-plugin
                                    </groupId>
                                    <artifactId>
                                        replacer
                                    </artifactId>
                                    <versionRange>
                                        [1.5.3,)
                                    </versionRange>
                                    <goals>
                                        <goal>replace</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <execute />
                                    <runOnIncremental>true</runOnIncremental>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    ...
</build>

要求填写当前名称和版本:

(如果您愿意,请将完整的子路径放在basedir中,并从包含的文件名中删除**/。)

<build>
    ...
    <plugins>
        <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <version>1.5.3</version>
            <executions>
                <execution>
                    <id>replace-version-number</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <basedir>${project.basedir}/src/main/java</basedir>
                <includes>
                    <include>**/Constants.java</include>
                </includes>
                <preserveDir>true</preserveDir>
                <replacements>
                    <replacement>
                        <token>mavenProjectName = ".*"</token>
                        <value>mavenProjectName = "${project.name}"</value>
                    </replacement>
                    <replacement>
                        <token>mavenProjectVersion = ".*"</token>
                        <value>mavenProjectVersion = "${project.version}"</value>
                    </replacement>
                </replacements>
            </configuration>
        </plugin>
        ....
    </plugins>
    ...
</build>

IN Constants.java:

...
private static final String mavenProjectName = "";
private static final String mavenProjectVersion = "";
...

在编译阶段之前,generate_sources阶段的值将填充POM的值。

替换者令牌中的通配符.*表示即使您将更新后的副本检入源代码管理中,该值也会更新。