在Java jar清单中嵌入SVN版本号的最佳实践是什么?

6
我看到像如何使用maven从svn获取版本号这样的问题,但对于清单中要使用的实际字段(即版本#和存储库URL)是否有任何标准(事实上或其他)? 我已经看到过使用Implementation-Version,带或不带前缀“r”(用于修订),也看到过使用Implementation-Build:

编辑我删除了maven标签,那里不应该有它。我的问题是关于jar内容,而不是关于工具本身的。


我不知道有任何标准。每个公司/开发者似乎都对如何管理版本号有自己的看法,更别提如何记录和描述该修订版了 :-) - Mark O'Connor
1
如果您想以编程方式读取修订号,除了清单文件之外(或至少除了清单文件之外),您可能需要考虑使用其他文件。从JVM内部读取MANIFEST.MF实际上非常麻烦,并且如果类加载器层次结构发生任何变化,则在不同环境中可能会不一致。 - Mike Deck
请参见:https://dev59.com/HVvUa4cB1Zd3GeqPyvYM - Steven R. Loomis
哈,很高兴这是一个受欢迎的问题。现在我只需要自己去做一下就好了。 - Steven R. Loomis
1个回答

3
不幸的是,JAR清单本身没有任何版本编号的标准。
但实际上,有另一种标准的方法可以自动更新修订号。您可以使用svn:keywords来获取每次提交后文件中的当前修订号。有一个$Revision$属性用于修订替换和$HeadURL$用于存储库URL替换。您只需将以下字符串放入文件并将此文件放置在版本控制下:
$Revision$ $HeadURL$

如果您使用Maven动态创建清单文件,我建议将以下内容放入version.properties文件中:
revision=$Revision$
repourl=$HeadURL$

然后在pom.xml中添加该语句(maven应启用properties插件):
<plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-1</version>
    <executions>
      <execution>
        <phase>initialize</phase>
        <goals>
          <goal>read-project-properties</goal>
        </goals>
        <configuration>
          <files>
            <file>version.properties</file>
          </files>
        </configuration>
      </execution>
    </executions>
  </plugin>

然后您就可以将修订号和仓库 URL 放入清单中:
<manifest>
  <attribute name="Revision" value="${revision}" />
  <attribute name="Repository URL" value="${repourl}" />
</manifest>

请注意,为了使用实际的值替换文件中的$Revision$$HeadURL$,您需要使用Subversion属性显式启用svn:keywords。如果您决定使用version.properties,则需要运行以下命令:
svn propset svn:keywords Revision version.properties
svn propset svn:keywords HeadURL version.properties

谢谢,一个更正是在propset中应该是“Revision \ HeadURL”而不是“Id”。但是,$Revision只包括version.properties的版本(请参见:http://svnbook.red-bean.com/en/1.7/svn.advanced.props.special.keywords.html“where's globalrev”)但是,$HeadURL$不经常更改(除非您切换子目录)。因此,我应该考虑使用HeadURL而不是完全忽略关键字。感谢。 - Steven R. Loomis

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