我正在用Java编写API接口,我想添加一个方法,客户端将用它来检查服务器使用的版本是否相同。
我可以添加final String VERSION = "v1.2.3";
这样的内容,但我想确保该版本始终是最新的。
我想防止该字段可能无法更新。
我在运行时搜索类哈希计算(甚至在maven编译时可能会生成带有哈希的资源文件)。
当我使用git时,也许Git可以使用其提交哈希更新文件中的特殊标记,并且在运行时我会为API中涉及的每个源返回一个hashCode? p>
我该怎么办?
答案 0 :(得分:1)
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");
}
}
在version.properties
中创建文件.../src/main/resources
。这是资源的maven默认目录。
artifact=${project.artifactId}
version=${project.version}
buildTimestamp=${build.timestamp}
build=${buildNumber}
将这些属性添加到pom.xml
<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>
将其添加到pom.xml中的<build>
部分:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
然后您可以在项目中使用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)