Как получить номер ревизии Subversion и URL с помощью maven - PullRequest
4 голосов
/ 15 апреля 2009

Я делаю извлечение какой-либо ветви или тега из хранилища Subversion, а затем собираю проект с помощью Maven.

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

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

Ответы [ 9 ]

4 голосов
/ 23 апреля 2009

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

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

4 голосов
/ 15 апреля 2009

Вы можете использовать maven-antrun-plugin для выполнения 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>

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

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

1 голос
/ 08 августа 2014

Решение, представленное user2990242, отлично подходит для автономного (спасибо за хорошее объяснение). После этого вам просто нужно добавить информацию в 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>
1 голос
/ 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 сообщает номер версии с помеченной буквой М. Что если я экспериментирую с веткой, которая содержит смешанную версию? 'svnversion' может справиться с этим. 'svn info' не может. Хуже того, как показано выше, он предоставит вводящую в заблуждение и потенциально пагубную информацию, если, например, я основываюсь на выводе плохой информации.

1 голос
/ 15 апреля 2009

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

0 голосов
/ 14 ноября 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>
0 голосов
/ 29 августа 2013

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

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

0 голосов
/ 16 февраля 2011

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

0 голосов
/ 30 сентября 2009

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

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

...