Что такое хороший способ обработки номера версии в приложении Java?
Я разрабатываю настольное приложение с использованием Java и Swing Application Framework. У меня есть приложение о коробке, и я хотел бы, чтобы в этом поле содержалось некоторое указание на то, какая версия тестируется. Я предпочитаю, чтобы это значение было изменено автоматическим способом. Я использую CruiseControl для создания приложения, вызванного коммитами SVN.
Какой механизм для других используют для выполнения этой работы? Есть ли в библиотеке номер версии или набор ant связанных инструментов, которые я могу просто добавить в свой процесс сборки?
Я не ищу варианты развертывания или, во всяком случае, автоматически проверяю наличие обновлений или что-то в этом роде. Я просто хочу спросить тестера, какая версия находится в окне и получить надежный ответ.
Ответы
Ответ 1
Я начну этот пост, заявив, что я использую Apache Maven для сборки. Вы также можете сделать подобное с помощью Ant или другого инструмента, но это то, что я сделал с помощью maven.
Лучший способ, с помощью которого я нашел это, - использовать версию вашего проекта плюс ревизию subversion как номер сборки. Из maven вы можете включить следующее. Это даст вам номер ревизии subversion как ${scm.revision}.
<build>
<plugins>
<plugin>
<artifactId>maven-scm-plugin</artifactId>
<executions>
<execution>
<id>getting-scm.revision</id>
<phase>validate</phase>
<goals>
<goal>update</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
После этого я затем использую это как часть манифеста файла jar в качестве версии реализации.
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifestEntries>
<Implementation-Version>${this.version}.${scm.revision}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
Самое приятное в том, что вы можете получить доступ к этому из кода, используя следующее:
Package p = getClass().getPackage();
String version = p.getImplementationVersion();
Это дает вам полный номер сборки, например, "1.0.13525", где последним номером является ревизия subversion. Для получения дополнительной информации об установке этого параметра вы можете просмотреть полный пост в блоге Я сделал некоторое время назад по этой самой проблеме.
Ответ 2
Создайте конструкцию script, создав файл свойств, содержащий версию. Это хорошая идея, чтобы захватить ревизию # прямо из SVN. Таким образом, вы можете ссылаться на него в тестах. Поместите этот файл свойств в упакованную банку и прочитайте ее во время выполнения. Обычно у вас есть основные и второстепенные версии, заданные как параметры для ant script, когда ревизия управляется автоматически SVN и дает согласованный номер сборки для ссылок.
Эта цель фрагмента запускает командную строку svn и выводит в файл temp (svndump).
Затем создав строку xx.yy.zz, поместите ее в другой файл, который позже будет включен в jar.
Обратите внимание, что xx.yy берутся из внешних параметров, это майорно-младшая версия.
<target name="getrev">
<exec executable="svn" output="svndump">
<arg value="info"/>
<arg value="${my.svn.url}"/>
</exec>
<property file="svndump"/>
<property name="my.build" value="${Revision}"/>
<property name="my.rev" value="${my.ver}.${my.build}"/>
<echo message="current revision is ${my.rev}"/>
<property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/>
<echo message="${my.rev}" file="${my.dir.projects}/revision"/>
<delete file="svndump"/>
</target>
Ответ 3
С Maven я использовал buildnumber-maven-plugin, который получает номер версии из Subversion или использует последовательность или временную метку, которая затем используется вместо замены ${buildNumber}
, где бы вы ни находились. Я полагаю, что другие инструменты сборки и серверы непрерывной интеграции имеют схожие функции. Найдите свою любимую поисковую систему с номером сборки "< your-tool > ".
Ответ 4
Вы делаете это слишком сложно. SVN предоставляет номер версии в виде макроса, например CVS.
Создайте простой inverface, содержащий константу, и создайте экземпляр SVN, который через макрос, например
public interface IVersionNumber {
public static final String version = "$Id$" ;
}
Вам нужно указать SVN, чтобы использовать ключевые слова в этом файле, так как
$svn propset svn: ключевые слова "Id" IVersion.java
Вы можете прочитать о свойствах здесь.
Ответ 5
Мы долгое время использовали JReleaseInfo. Вы можете настроить его в своем Ant script (мы не используем Maven для наших проектов), и он автоматически ударяет номер версии. Он также имеет некоторые приятные дополнения в том, что он генерирует класс, содержащий всю информацию. Вы можете просто вызвать этот класс в своем коде, чтобы получить строки, готовые к использованию, или вызвать класс из командной строки, чтобы распечатать номер версии без необходимости менять код.
Ответ 6
Поскольку я использую круиз-контроль и Ant, чтобы построить все, я закончил, по крайней мере, сейчас, используя свойство ${label}, переданное в вызов ant для строительства проекта. В моем файле ant я использую ant "replace" task, чтобы изменить файл свойств, содержащий ресурс about box с именем Application.версия, чтобы включить эту метку.
Я планирую перейти от приращения меток к svn label incrementer, а затем используйте номер версии svn таким образом. Это всего лишь немного больше работы, и для меня требуется внести изменения в конфигурационный файл круиз-контроля.