如何从源生成API版本?

时间:2015-07-30 09:25:10

标签: java git maven

我正在用Java编写API接口,我想添加一个方法,客户端将用它来检查服务器使用的版本是否相同。

我可以添加final String VERSION = "v1.2.3";这样的内容,但我想确保该版本始终是最新的。

我想防止该字段可能无法更新。

我在运行时搜索类哈希计算(甚至在maven编译时可能会生成带有哈希的资源文件)。

当我使用git时,也许Git可以使用其提交哈希更新文件中的特殊标记,并且在运行时我会为API中涉及的每个源返回一个hashCode?

我该怎么办?

3 个答案:

答案 0 :(得分:1)

  1. 创建一个类似于此的类:
  2. package com.company;
    
    import java.io.IOException;
    import java.util.Properties;
    
    public class VersionHelper
    {
        static Properties versionProps=new Properties();
    
        static
        {
            try
            {
                versionProps.load(VersionHelper.class.getResourceAsStream("/version.properties"));
            }
            catch (IOException e)
            {
                System.err.println("Version von "+VersionHelper.class.getName()+" kann nicht ermittelt werden");
            }
        }
    
        public static String getArtifactId()
        {
            return versionProps.getProperty("artifact");
        }
    
        public static String getVersion()
        {
            return versionProps.getProperty("version");
        }
    
        public static String getBuild()
        {
            return versionProps.getProperty("build");
        }
    
        public static String getBuildTimeStamp()
        {
            return versionProps.getProperty("buildTimestamp");
        }
    }
    
    1. version.properties中创建文件.../src/main/resources。这是资源的maven默认目录。

      artifact=${project.artifactId}
      version=${project.version}
      buildTimestamp=${build.timestamp}
      build=${buildNumber}
      
    2. 将这些属性添加到pom.xml

    3. <properties>
          <!-- look at http://rterp.wordpress.com/2012/03/16/stamping-version-number-and-build-time-in-properties-file-with-maven/ -->
          <build.timestamp>${maven.build.timestamp}</build.timestamp>
          <maven.build.timestamp.format>dd.MM.yyyy HH:mm</maven.build.timestamp.format>
      </properties>
      
      1. 将其添加到pom.xml中的<build>部分:

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        
      2. 然后您可以在项目中使用VersionHelper中的get方法

答案 1 :(得分:0)

好的,所以这是我的解决方案,它肯定不是最有效的方法,但它可以解决问题:

在我的pom.xml中,我添加了这个:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <configuration>
                <target>
                    <macrodef name="gitlog">
                        <attribute name="lfile" />
                        <sequential>
                            <local name="gitHash"/>
                            <exec executable="git" outputproperty="gitHash">
                                <arg value="log" />
                                <arg value="--format=%H" />
                                <arg value="-n" />
                                <arg value="1" />
                                <arg value="--" />
                                <arg value="@{lfile}" />
                            </exec>
                            <concat append="true" destfile="target/classes/api_hashes.txt">@{lfile}:${gitHash}${line.separator}</concat>
                        </sequential>
                    </macrodef>

                    <loadfile property="api.classes" srcFile="api_classes.txt" />

                    <delete file="target/classes/api_hashes.txt"/>
                    <ac:for list="${api.classes}" param="classFile" delimiter="|" xmlns:ac="antlib:net.sf.antcontrib">
                        <sequential>
                            <gitlog lfile="@{classFile}" />
                        </sequential>
                    </ac:for>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>ant-contrib</groupId>
            <artifactId>ant-contrib</artifactId>
            <version>1.0b3</version>
            <exclusions>
                <exclusion>
                    <groupId>ant</groupId>
                    <artifactId>ant</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</plugin>

我的api_classes.txt文件包含由char |分隔的类文件(源)列表(无法使用cariage返回)在一行中,它生成一个包含源代码的文件,char:和earch源的最后一个git哈希。

答案 2 :(得分:0)

我可能不完全理解你的问题。也许这有助于一些......

由于评论显示您使用的是Maven,请查看<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.0.0/lodash.min.js"></script> here。一些很好的使用示例也是here。我已经能够毫不费力地使用它了,它非常适合我。我想更进一步,创建一个页脚,在我的Web应用程序显示的每个页面上公开构建号,以便在我获得带故障单的完整屏幕截图时准确了解正在使用的版本。