Статьи

Плагин Maven Build Number — Пример использования

Предположим, нам нужно добавить номер сборки к какому-либо артефакту (jar, war и т. Д.). Здесь я хотел бы продемонстрировать использование buildnumber-maven-plugin .

Этот пост основан на:

У нас есть какой-то проект, и нам нужно включить в последовательный номер сборки файла манифеста jar, который не основан на номере ревизии VCS (SVN, Git, Mercurial и т. Д.). Давайте создадим соответствующий файл pom.xml и реализуем небольшую демонстрацию, чтобы проверить результат.

Создать Maven проект

1
2
3
$ mvn archetype:generate -DgroupId=org.halyph -DartifactId=buildNoTest\
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false

Создайте pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 <modelversion>4.0.0</modelversion>
 <groupid>org.halyph</groupid>
 <artifactid>buildNoTest</artifactid>
 <packaging>jar</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>buildNoTest</name>
  
 <dependencies>
  <dependency>
   <groupid>junit</groupid>
   <artifactid>junit</artifactid>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
 </dependencies>
  
 <properties>
  <project.build.sourceencoding>UTF-8</project.build.sourceencoding>
 </properties>
  
 <!--
 If you have access to scm then you can place actual url's.
 Otherwise with <revisionOnScmFailure /> you can give some fake URLs as follows.
 -->
 <scm>
  <connection>scm:svn:http://none</connection>
  <developerconnection>scm:svn:https://none</developerconnection>
  <url>scm:svn:https://none</url>
 </scm>
  
 <build>
  <resources>
   <resource>
    <directory>src/main/resources</directory>
   </resource>
   <resource>
    <directory>src/main/filtered-resources</directory>
    <filtering>true</filtering>
   </resource>
  </resources>
  <plugins>
   <plugin>
    <groupid>org.codehaus.mojo</groupid>
    <artifactid>buildnumber-maven-plugin</artifactid>
    <version>1.1</version>
    <executions>
     <execution>
      <phase>generate-resources</phase>
      <goals>
       <goal>create</goal>
      </goals>
     </execution>
    </executions>
    <configuration>
     <!--
      doCheck and doUpdate actually talk to repository if it's true,
      Check would check that there are no local changes.
      Update would update it
     -->
     <docheck>false</docheck>
     <doupdate>false</doupdate>
     <!--
      This ensures that even if we are not connected to scm than also
      take the version from local .svn file
     -->
     <revisiononscmfailure>
       
     <!--
      Generate sequence build number based on:
      build number and timestamp     
     -->
     <format>Build: #{0} ({1,date})</format>
     <items>
      <item>buildNumber\d*</item>
      <item>timestamp</item>
     </items>
    </revisiononscmfailure></configuration>
   </plugin>
   <plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-jar-plugin</artifactid>
    <version>2.1</version>
    <configuration>
     <archive>
      <!-- will put the entries into META-INF/MANIFEST.MF file -->
      <manifestentries>
       <implementation-version>${project.version}</implementation-version>
       <implementation-build>${buildNumber}</implementation-build>
      </manifestentries>
     </archive>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>

Создать демо-приложение для проверки результатов

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package org.halyph;
 
import java.io.IOException;
import java.util.ResourceBundle;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
 
public class App
{
    public static void main( String[] args ) throws IOException
    {
        System.out.println('Verify Resource bundle' );
   
 // Check filtered resources based on generated build number
        ResourceBundle bundle = ResourceBundle.getBundle( 'build' );
        String msg = bundle.getString( 'build.message' );
        System.out.println(msg);
 
        System.out.println('\nVerify Generated MANIFEST.MF Properties' );
 
 // Check Manifest file based on generated build number
        Manifest mf = new Manifest();
        mf.read(Thread.currentThread().getContextClassLoader().getResourceAsStream('META-INF/MANIFEST.MF'));
 
        Attributes atts = mf.getMainAttributes();
 
        System.out.println('Implementation-Versio: ' + atts.getValue('Implementation-Version'));
        System.out.println('Implementation-Build: ' + atts.getValue('Implementation-Build'));
    }
}

Создайте приложение несколько раз и запустите

1
$ mvn install
1
2
3
4
5
6
7
$ java -cp target\buildNoTest-1.0-SNAPSHOT.jar org.halyph.App
Verify Resource bundle
Build: #3 (Jun 27, 2012)
 
Verify Generated MANIFEST.MF Properties
Implementation-Versio: 1.0-SNAPSHOT
Implementation-Build: Build: #3 (Jun 27, 2012)

Резюме

  1. Мы должны сообщить buildnumber-maven-plugin, что мы не будем использовать ревизию контроля версий в качестве номера сборки, добавив поддельный раздел <scm> в pom.xml и <revisionOnScmFailure /> в buildnumber-maven-plugin <configuration>
  2. Реализован пользовательский формат номера сборки, см. Buildnumber-maven-plugin <configuration> / <format> и <configuration> / <items>.
  3. Добавлен номер сборки в манифест jar, см. Раздел maven-jar-plugin pom.xml
  4. Проверяется, можно ли правильно добавить сгенерированный номер сборки в отфильтрованные ресурсы
  • создан файл src \ main \ Filter-resources \ build.properties
  • 1
    build.message=${buildNumber}
  • добавлена ​​фильтрация ресурсов, см. раздел <resource> flag <filtering> true </ filtering>
  • Демонстрационное приложение, проверяющее отфильтрованные ресурсы и номер сборки в файле манифеста jar
  • Вы можете сделать клон этого проекта https://github.com/halyph/blog-sandbox/tree/master/Maven/blogpost_062712

    Ссылка: Maven Build Number Plugin — пример использования от нашего партнера JCG Ореста Ивасива в блоге Knowledge Is Everything .