Как получить номер текущей версии Subversion и URL-адрес с помощью maven

Я проверяю какую-то ветку или тег из репозитория Subversion, а затем создаю проект с помощью maven.

Теперь я хочу получить текущий номер ревизии и URL-адрес какого-либо файла. Как я могу это сделать? То есть я хотел бы получить номер версии и URL-адрес той ветки / тега, которую я проверял.

Я знаю о buildnumber-maven-plugin, но думаю, что он этого не делает. . Он извлекает номер версии ветки, указанной в pom.xml.


person Juha Syrjälä    schedule 15.04.2009    source источник


Ответы (9)


Решение, предложенное пользователем2990242, отлично подходит для автономного использования (спасибо за хорошее объяснение). После этого вам просто нужно добавить информацию в manifest.mf с помощью плагина maven-jar (или maven-war). вот полный пример:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <timestampFormat>{0,date,dd-MM-yyyy HH:mm:ss}</timestampFormat>
                <doCheck>false</doCheck>
                <doUpdate>false</doUpdate>
                <providerImplementations>
                    <svn>javasvn</svn>
                </providerImplementations>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
                    <artifactId>maven-scm-provider-svnjava</artifactId>
                    <version>2.1.1</version>
                </dependency>
                <dependency>
                    <groupId>org.tmatesoft.svnkit</groupId>
                    <artifactId>svnkit</artifactId>
                    <version>1.8.5</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                    <manifestEntries>
                        <Implementation-Build>${buildNumber}</Implementation-Build>
                        <Implementation-Title>${project.name}</Implementation-Title>
                        <Implementation-Vendor>ENTERPRISE</Implementation-Vendor>
                        <Implementation-Version>${project.version}</Implementation-Version>
                        <Built-By>${user.name}</Built-By>
                        <Built-OS>${os.name}</Built-OS>
                        <Build-Date>${timestamp}</Build-Date>
                        <SCM-Revision>${buildNumber}</SCM-Revision>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
person Chaya    schedule 08.08.2014

Для выполнения svnversion.

<project>
  […]
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <configuration>
              <tasks>
                <exec executable="sh">
                  <arg value="-c"/>
                  <arg value="svnversion &gt;version.txt" />
                </exec>
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  […]
</project>

NB: я использовал sh -c для запуска svnversion, поэтому я могу перенаправить вывод в файл. Я не думаю, что вы можете получить вывод в виде свойства для использования в сборке maven.

Вы можете использовать тот же подход для запуска svn info --url.

person Dominic Mitchell    schedule 15.04.2009
comment
В итоге я использовал этот подход. Однако я вызываю двоичный файл svn напрямую, поэтому он должен работать как с Linux, так и с Windows. - person Juha Syrjälä; 27.04.2009
comment
Что касается , я не думаю, что вы можете получить вывод в свойство для использования в сборке maven: <exec outputproperty="my.revision" executable="svnversion"> помогает мне. Но: ваш ответ соответствует вопросу, который просит сохранить его в файле. В качестве альтернативы можно было бы использовать ${my.revision} в каком-нибудь src/main/resources/my.properties файле и использовать <resources>...<filter>true</filter></resources> для замены этих заполнителей во время сборки. - person Arjan; 22.10.2010

Как уже было сказано, для поиска версии можно использовать Maven Build Number Plugin.

Что касается URL: Maven Practice помещает его в POM с помощью ‹scm >-тег. Если вы настроите это право один раз, а затем используете подключаемые модули Maven appriopriate (maven-scm-plugin , maven-release-plugin) для ветвления, тегирования, выпуска и т. д. Вы можете быть уверены, что тег ‹scm› всегда содержит правильный URL.

person Thomas Marti    schedule 23.04.2009
comment
Это требует, чтобы я поместил URL-адрес svn, который я проверяю, в pom.xml. У меня это не работает. Я не проверяю с помощью maven, и иногда я проверяю ствол, иногда веткуX, иногда ветвь. Я хочу получить данные о версии из проверенного дерева svn. - person Juha Syrjälä; 02.05.2009
comment
Если вы можете жить с решением Dominics, это прекрасно, но есть веская причина, по которой люди из Maven решили поместить тег ‹scm› в POM. Вы можете получить исходный код другим способом, кроме SVN (возможно, вы используете «svn export», или вы используете заархивированный исходный файл или что-то еще). Кстати, проверка разных веток - не проблема, потому что, если вы используете mvn release: branch для их создания, POM будут иметь правильное значение в теге ‹scm›. - person Thomas Marti; 05.05.2009
comment
Возможно, мне придется пересмотреть это, если мы когда-нибудь будем использовать maven для создания веток. В настоящее время мы делаем это напрямую через svn. Также, похоже, были некоторые проблемы с плагином номера сборки и родительским / дочерним pom.xmls. - person Juha Syrjälä; 05.05.2009

buildnumber-maven-plugin внедряет в вашу сборку только текущую версию, так что вы правы. Я думаю, чтобы получить URL-адрес, вам следует написать плагин maven, который использует SVNKit.

person dfa    schedule 15.04.2009

Мне кажется, что API поддерживает только выполнение команды svn и ее различных параметров и переключателей. Проблема в том, что в Subversion для получения правильного подробного номера версии используется другая исполняемая команда, которая называется «svnversion». Используя эту команду, я могу определить, есть ли у меня смешанная версия, модифицированная версия и т. Д. Например:

[jim@localhost sb_rc1 993]$ svn info | grep Revision
Revision: 51159
[jim@localhost sb_rc1 994]$ svnversion
51159M
[jim@localhost sb_rc1 994]$

Угадай, что? "svn info" врет мне здесь. Моя локальная копия изменена с оригинальной 51159, поэтому svnversion сообщает номер версии с прикрепленной к нему буквой M. Что делать, если я экспериментирую с веткой, содержащей смешанную версию? svnversion с этим справится. 'svn info' не может. Хуже того, как показано выше, он предоставит вводящую в заблуждение и потенциально опасную информацию, если, например, я основываю выпуск на плохой информации.

person Jim C.    schedule 04.11.2009

Вы уже сказали, что это не соответствует вашим потребностям, но для других, у которых есть аналогичная проблема, стоит отметить, что вы можете использовать Maven SCM API, чтобы вызывать произвольные команды SCM для репозитория, настроенного в разделе scm вашего POM. Например, в этом ответе я показал, как зафиксировать один файл в Maven mojo.

Вы можете немного изменить этот пример, чтобы вместо этого понизить SCMProvider до SvnExeScmProvider и вызвать его метод info(). Это возвращает SvnInfoScmResult, который оборачивает SvnInfoItem. Этот элемент инкапсулирует результаты выполнения команды svn info через стандартный Subversion API.

person Rich Seller    schedule 30.09.2009

Для полноты, antrun поддерживает экспорт свойств ant в mvn, начиная с версии 1.7. См. Добавление нового параметра для экспорта свойств Ant в свойства Maven

person Alberto    schedule 16.02.2011

Это старый вопрос, но buildnumber-maven-plugin теперь предоставляет значение ${scmBranch} с URL-адресом SCM в нем. Я кратко попробовал, и, похоже, он работает. Чтобы использовать его при фильтрации ресурсов, вам нужно сначала поместить его в свойство, как и значение timestamp, предоставляемое Maven.

См. http://mojo.codehaus.org/buildnumber-maven-plugin/usage.html для получения дополнительной информации.

person Frans    schedule 29.08.2013

Buildernumber-maven-plugin зависит от клиента svn, который вы установили, когда "providerImplementations" не указан в конфигурации плагина. Когда путь выполнения svn не определен в системном пути или ваша версия клиента svn не соответствует, плагин не может правильно вызвать командную строку svn.

Итак, добавление клиента javasvn и его зависимости - хорошая идея.

      <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.2</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <doCheck>false</doCheck>
                <doUpdate>false</doUpdate>
                <providerImplementations>
                  <svn>javasvn</svn>
                </providerImplementations>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>com.google.code.maven-scm-provider-svnjava</groupId>
                    <artifactId>maven-scm-provider-svnjava</artifactId>
                    <version>2.0</version>
                </dependency>
                <dependency>
                    <groupId>org.tmatesoft.svnkit</groupId>
                    <artifactId>svnkit</artifactId>
                    <version>1.7.8</version>
                </dependency>
            </dependencies>
        </plugin>
person benny.liu    schedule 14.11.2013