Получение maven для выполнения программы и сохранения вывода в свойство, которое может быть использовано в манифесте.jar

Я хотел бы выполнить git describe как часть сборки maven и использовать полученный результат в манифесте для сборки пакета.jar.

Я знаю, как сделать это в муравье через <exec> задача с outputproperty к переменной свойства муравья, но у меня очень мало опыта работы с Maven и я даже не знаю, где искать.

Это возможно?


Я нашел это в примере файла pom.xml, поэтому добавить что-то в манифест выглядит довольно просто:

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>my.class.here.Myclass</mainClass>
                            <classpathLayoutType>custom</classpathLayoutType>
                            <customClasspathLayout>lib/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Не уверен, как захватить выполнение команды, хотя.

3 ответа

Вот предложенный подход:

  • Используйте Exec Maven Plugin для запуска ваших команд git и записи в файл свойств (имя = значение шаблона, если это возможно)
  • Используйте плагин Properties Maven для загрузки конфигурации

Загруженная конфигурация может быть использована в качестве свойств в вашем POM. Мы в основном динамически создаем свойства нашей сборки. Для этого (чтобы использовать эти свойства) вышеприведенные шаги должны быть выполнены как можно раньше в потоке сборки (т.е. validate или же initialize фаза).

Ниже приведен пример потока, только что протестированный и отлично работающий (на Windows-машине):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>generation</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1</version>
                <executions>
                    <execution>
                        <id>retrieve-config</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>echo</executable>
                    <arguments>
                        <argument>jar.name=from-exec</argument>
                        <argument>></argument>
                        <argument>config.properties</argument>
                    </arguments>
                    <workingDirectory>${basedir}/src/main/resources/</workingDirectory>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0-alpha-2</version>
                <executions>
                    <execution>
                        <id>read-properties</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>${basedir}/src/main/resources/config.properties</file>
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <finalName>${jar.name}</finalName>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

По сути, плагин exec прикреплен к validate фаза будет выполнена в начале сборки, записав в файл config.properties (с помощью команды echo) содержимое jar.name=from-exec,

Затем плагин свойств прилагается к initialize Фаза прочитает этот файл config.properties и загрузит свойства, которые будут использоваться как часть сборки.

Затем, в качестве примера, плагин jar будет использовать это свойство как часть своей конфигурации (<finalName>${jar.name}</finalName> часть).

Бег mvn clean package, вы найдете from-exec.jar файл в целевой папке.

Если вы не можете получить способ получить результат git describe в качестве шаблона name=value у вас (в худшем случае) может быть два выполнения плагина Exec Maven Plugin: первая запись в файл имени свойства и символа равенства (т. е. с помощью эха), вторая (git describe) добавив в файл значение свойства.

Здесь есть плагин Maven https://github.com/ktoso/maven-git-commit-id-plugin который будет делать то, что вы хотите.

Если вы подключитесь к вашей сборке, она сгенерирует переменную Maven с именем ${git.commit.id.describe}, которую затем вы сможете использовать фильтрацию ресурсов Maven для динамического изменения вашего манифеста.

Основываясь на том, что сказал @A_Di-Matteo, вы можете добавить тег git в файл свойств, подобный этому

В плагине maven exec.

              <execution>
            <id>set-git-tag</id>
            <phase>validate</phase>
            <goals>
              <goal>exec</goal>
            </goals>
            <configuration>
              <executable>bash</executable>
              <arguments>
                <argument>-c</argument>
                <argument>echo git.tag=`git describe --always --dirty=-modified`</argument>
                <argument>></argument>
                <argument>config.properties</argument>
              </arguments>
              <workingDirectory>${basedir}/src/main/resources/</workingDirectory>
            </configuration>
          </execution>

Вы также можете добавить к существующему файлу, например, так

                <execution>
            <id>set-git-tag</id>
            <phase>validate</phase>
            <goals>
              <goal>exec</goal>
            </goals>
            <configuration>
              <executable>bash</executable>
              <arguments>
                <argument>-c</argument>
                <argument>echo git.tag=`git describe --always --dirty=-modified`</argument>
                <argument>>></argument>
                <argument>${basedir}/src/main/resources/config.properties</argument>
              </arguments>
            </configuration>
          </execution>

Ограничение здесь в том, что для этого требуется bash.

Другие вопросы по тегам