Как лучше всего хранить информацию о версии Subversion в EAR?

Когда я получаю отчет об ошибке или сообщение "Это не работает", я всегда задаю вопрос о том, какая версия? Поскольку разные сборки находятся на многих этапах тестирования, планирования и развертывания, это часто нетривиальный вопрос.

В случае выпуска файлов Java JAR (ear, jar, rar, war) я хотел бы иметь возможность просматривать / просматривать JAR и переключаться на ту же ветку, версию или тег, которые были источником выпущенного JAR.

Как мне лучше всего настроить процесс сборки ant, чтобы информация о версии в svn checkout оставалась в созданной сборке?

Я думал примерно так:

  • добавление файла ВЕРСИИ, но с каким содержанием?
  • хранить информацию в файле META-INF, но под каким свойством и каким содержимым?
  • копирование исходников в архив результатов
  • добавлены свойства svn: для всех источников с ключевыми словами в тех местах, где компилятор оставляет их.

В итоге я использовал подход svnversion (принятый anwser), потому что он сканирует все поддерево, а не svn info, который просто просматривает текущий файл / каталог. Для этого я определил задачу SVN в файле ant, чтобы сделать его более переносимым.

<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask">
  <classpath>
    <pathelement location="${dir.lib}/ant/svnant.jar"/>
    <pathelement location="${dir.lib}/ant/svnClientAdapter.jar"/>
    <pathelement location="${dir.lib}/ant/svnkit.jar"/>
    <pathelement location="${dir.lib}/ant/svnjavahl.jar"/>
  </classpath>        
</taskdef>

Не все сборки приводят к появлению веб-сервисов. Уха-файл перед развертыванием должен оставаться с тем же именем из-за обновления на сервере приложений. Создание исполняемого файла по-прежнему возможно, но до тех пор я просто включаю файл с информацией о версии.

<target name="version">
  <svn><wcVersion path="${dir.source}"/></svn>
  <echo file="${dir.build}/VERSION">${revision.range}</echo>
</target>

Ссылки:
svnrevision: http://svnbook.red-bean.com/en/1.1/re57.html
svn info http://svnbook.red-bean.com/en/1.1/re13.html
subclipse svn task: http://subclipse.tigris.org/svnant/svn.html
svn-клиент: http://svnkit.com/


person Rene    schedule 05.10.2008    source источник
comment
У меня SvnTask более портативен, чем запуск svnversion, как в принятом ответе?   -  person Arne Evertsson    schedule 14.10.2008


Ответы (9)


Используйте команду svnversion в сценарии Ant, чтобы получить номер версии:

<exec executable="svnversion" outputproperty="svnversion" failonerror="true">
  <env key="path" value="/usr/bin"/>
  <arg value="--no-newline" />
</exec>

Затем используйте свойство $ {svnversion} где-нибудь в EAR. Мы помещаем его в имя файла EAR, но вы также можете поместить его в файл readme или версию внутри EAR или указать версию в файле META-INF / manifest.mf EAR:

<!-- myapp-r1234.ear -->
<property name="ear" value="myapp-r${svnrevision}.ear" />
person Peter Hilton    schedule 05.10.2008

Вы хотите указать ветку Subversion и номер репозитория. Как описано в Как получить доступ к текущему номеру сборки Subversion? , команда svn info предоставит вам эту информацию, которую вы затем можете использовать для создания файла VERSION или помещения в любой из других файлов, которые вы создаете в своих файлах * AR. Если вы больше ничего не думаете, вы можете рассмотреть возможность использования задачи XmlProperty Ant для извлечения соответствующей информации из вывода вашей команды svn info --xml

person Blair Conrad    schedule 05.10.2008

Ознакомьтесь с проектом jreleaseinfo. Содержит задачу ANT, которая может генерировать класс java, который можно вызывать во время выполнения для отображения информации о выпуске вашего проекта.

Мне нравится его простота.

person Mark O'Connor    schedule 02.04.2010

См. Также этот вопрос: Сборка и нумерация версий для проектов Java (муравей, cvs, хадсон)

Он включает несколько полезных фрагментов кода.

person Ed Brannin    schedule 21.05.2010

Из глубины моей головы. Тег для каждой сборки jar?

person svrist    schedule 05.10.2008

У нас есть первая часть нашей сборки, создающая файл version.txt в корне пакета и выгружаем тег, используемый для проверки кода из (в нашем случае) CVS ... Кроме того, последняя часть нашего процесса сборки проверяет полностью встроенный EAR обратно в CVS для использования в будущем.

Таким образом, если у нас возникнет проблема с веб-приложением - это просто случай, когда репортера попросят нажать /app/version.txt - оттуда мы сможем развернуть конкретную историю сборки в CVS, чтобы найти соответствующие компоненты (обрабатывает разные версии библиотек в приложениях), чтобы найти ошибку.

Не уверен, насколько это помогает нашим специалистам службы поддержки, но они определенно жалуются на то, что их нет!

person Martin    schedule 05.10.2008

Выполняйте автоматические сборки и помещайте тег (с отметкой даты) в кодовую базу, когда сборка успешна (конечно, с помощью unittest).

В процессе доставки доставляйте заказчику только сборки с тегами. Таким образом, вы полностью контролируете ситуацию и можете поместить имя тега в файл readme.txt или сделать так, чтобы имя файла Ear отражало имя тега.

Я лично перешел на CVS, и это одна из причин. В CVS я могу получить отчет о своем классе. Все мои jar-файлы содержат "main", что делает их работоспособными. Что касается вопросов поддержки, я прошу клиента выполнить «java -jar somejar.jar» и отправить мне результат вместе с вопросом.

Таким образом, я уверен в том, какую сборку они используют, и даже могу получить такую ​​информацию, как версия java, тип и версия ОС. Без того, чтобы клиенту приходилось отвечать на странные вопросы.

Это просто, но очень эффективно.

person Rolf    schedule 05.10.2008

Почему бы не поместить номер сборки в файл свойств ... это может быть легко прочитано java и выведено в Help | О диалоге (апплете / приложении), нижнем колонтитуле веб-страницы или любом другом графическом интерфейсе, который у вас может быть.

(См. Нижний колонтитул на каждой странице SOF .... там есть номер версии SVN.)

Кажется, это проще, чем искать в WAR / EAR / JAR и т. Д.?

person cagcowboy    schedule 05.10.2008

Я сохраняю абсолютную ревизию репозитория как часть моего полного номера версии. Это дает людям возможность быстро увидеть, относится ли данное изменение к данной версии или нет.

Мы также сохраняем номер версии / дату сборки / и т. Д. В файле манифеста уха в качестве настраиваемых свойств, в основном это только информационные свойства. Мы также сохраняем его в файле свойств, который встроен в нашу банку, чтобы приложение могло его прочитать.

person Mike Miller    schedule 20.10.2008