Предположим, нам нужно добавить номер сборки к какому-либо артефакту (jar, war и т. Д.). Здесь я хотел бы продемонстрировать использование buildnumber-maven-plugin .
Демонстрационное приложение, проверяющее отфильтрованные ресурсы и номер сборки в файле манифеста jar
Этот пост основан на:
- http://mojo.codehaus.org/buildnumber-maven-plugin/usage.html
- http://www.site.lalitbhatt.com/maven-build-number-plugin
- http://blog.peterlynch.ca/2009/11/buildnumber-maven-plugin-helpful.html
- http://apollo.ucalgary.ca/tlcprojectswiki/index.php/Public/Project_Versioning_-_Best_Practices#Build_Versioning
У нас есть какой-то проект, и нам нужно включить в последовательный номер сборки файла манифеста 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
|
<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/maven-v4_0_0.xsd"> <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> </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.AppVerify Resource bundleBuild: #3 (Jun 27, 2012)Verify Generated MANIFEST.MF PropertiesImplementation-Versio: 1.0-SNAPSHOTImplementation-Build: Build: #3 (Jun 27, 2012) |
Резюме
- Мы должны сообщить buildnumber-maven-plugin, что мы не будем использовать ревизию контроля версий в качестве номера сборки, добавив поддельный раздел <scm> в pom.xml и <revisionOnScmFailure /> в buildnumber-maven-plugin <configuration>
- Реализован пользовательский формат номера сборки, см. Buildnumber-maven-plugin <configuration> / <format> и <configuration> / <items>.
- Добавлен номер сборки в манифест jar, см. Раздел maven-jar-plugin pom.xml
- Проверяется, можно ли правильно добавить сгенерированный номер сборки в отфильтрованные ресурсы
- создан файл src \ main \ Filter-resources \ build.properties
- добавлена фильтрация ресурсов, см. раздел <resource> flag <filtering> true </ filtering>
|
1
|
build.message=${buildNumber} |
Вы можете сделать клон этого проекта https://github.com/halyph/blog-sandbox/tree/master/Maven/blogpost_062712
Ссылка: Maven Build Number Plugin — пример использования от нашего партнера JCG Ореста Ивасива в блоге Knowledge Is Everything .