使用maven将版本号输出到文本文件

我想生成一个zip文件,用maven更新一个应用程序。 该zip将托pipe在服务器上,我使用程序集插件来生成zip。 不过,我想Maven自动生成一个文本文件,将当前版本号存储在zip之外。 这可能吗?

编辑:我成功地使用maven Assembly Plugin和两个描述符来创build两个自定义程序集。 其中一个目录是单个目标,它只是基于过滤创build一个包含更新的version.txt的文件夹。 然后另一个有一个单一的目标实际上打包压缩文件。 这似乎是非常不雅,我想它不会正确地更新与整个更新的文件夹的Maven回购。 如果有更好的方法做到这一点,请让我知道。

当然。 在src / main / resources的某个地方创build一个文本文件,将其称为version.txt (或其他)

文件内容:

 ${project.version} 

现在在你的pom.xml中,在build元素里面,放上这个块:

 <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/version.txt</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>**/version.txt</exclude> </excludes> </resource> ... </resources> </build> 

在每次构build之后,文件(可以在目标/类中find)将包含当前版本。

现在,如果你想将文件自动移动到其他地方,你可能需要通过maven-antrun-plugin来执行一个ant任务。

像这样的东西:

  <build> ... <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.4</version> <executions> <execution> <phase>process-resources</phase> <configuration> <tasks> <copy file="${project.build.outputDirectory}/version.txt" toFile="..." overwrite="true" /> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 

使用标准的META-INF\MANIFEST.MF (然后你可以使用Java代码getClass().getPackage().getImplementationVersion()来获取版本)

对于.war使用这个configuration:

 <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> </manifest> </archive> </configuration> </plugin> 

这将在构build期间添加清单,或者您可以调用mvn war:manifest

另请参见如何获取运行Tomcat的软件包版本?

你所指的是所谓的过滤

您需要在特定资源上启用筛选,然后使用${project.version}将其replace为构build的一部分

您也可以使用Groovy脚本来生成版本信息文件。 我更喜欢这个方法,因为你不必在assembly-plugin的描述符中排除东西。 你也可以使用这个方法来select只包含从Jenkins / Hudson构build的东西(比如检查BUILD_ID等等)。

所以你会在这个pom.xml中有一个文件生成的groovy脚本:

  <plugin> <groupId>org.codehaus.mojo.groovy</groupId> <artifactId>groovy-maven-plugin</artifactId> <version>1.0-beta-3</version> <executions> <execution> <phase>test</phase> <goals> <goal>execute</goal> </goals> <configuration> <source> <![CDATA[ println("==== Creating version.txt ===="); File mainDir = new File("src/main"); if(mainDir.exists() && !mainDir.isDirectory()) { println("Main dir does not exist, wont create version.txt!"); return; } File confDir = new File("src/main/conf"); if(confDir.exists() && !confDir.isDirectory()) { println("Conf dir is not a directory, wont create version.txt!"); return; } if(!confDir.exists()) { confDir.mkdir(); } File versionFile = new File("src/main/conf/version.txt"); if(versionFile.exists() && versionFile.isDirectory()) { println("Version file exists and is directory! Wont overwrite"); return; } if(versionFile.exists() && !versionFile.isDirectory()) { println("Version file already exists, overwriting!"); } println("Creating Version File"); BufferedWriter writer = new BufferedWriter(new FileWriter(versionFile)); writer.write("groupId = ${project.groupId}"); writer.newLine(); writer.write("artifactId = ${project.artifactId}"); writer.newLine(); writer.write("version = ${project.version}"); writer.newLine(); writer.write("timestamp = ${maven.build.timestamp}"); String buildTag = ""; String buildNumber = ""; String buildId = ""; try { buildTag = "${BUILD_TAG}"; buildNumber = "${BUILD_NUMBER}"; buildId = "${BUILD_ID}"; writer.write("BUILD_TAG = " + buildTag + "\n"); writer.write("BUILD_NUMBER = " + buildNumber + "\n"); writer.write("BUILD_ID = " + buildId + "\n"); } catch (Exception e) { println("============= Could not find BUILD_TAG probably this is not a Jenkins/Hudson build ==========="); } writer.close(); ]]> </source> </configuration> </execution> </executions> </plugin> 

然后你的程序集插件在pom.xml中看起来像这样:

  <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2.1</version> <!-- Produce the all-dependencies-included jar for java classloaders --> <executions> <execution> <id>all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <finalName>${project.artifactId}</finalName> <descriptors> <descriptor>dist-all.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin> 

最后你的程序集描述符dist-all.xml看起来像这样:

 <?xml version="1.0" encoding="UTF-8"?> <assembly> <id>all</id> <formats> <format>dir</format> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>target</directory> <outputDirectory></outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <directory>src/main/conf</directory> <outputDirectory></outputDirectory> <includes> <include>**</include> </includes> </fileSet> </fileSets> </assembly> 

在Maven 3中,使用Sean的答案来创build你的version.txt文件,(这里显示的是我的,还有build date和active profile):

 ${project.version}-${profileID} ${buildDate} 

将属性profileID添加到每个configuration文件,例如:

 <properties> <profileID>profileName</profileID> </properties> 

使用Maven copy-resources将文件复制到一个更容易到达的目录,例如${basedir}${basedir}/target

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}</outputDirectory> <resources> <resource> <directory>${basedir}/target/.../[version.txt dir]/version.txt</directory> <includes> <include>version.txt</include> </includes> <filtering>true</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin> 

输出如下所示:

 1.2.3-profileName yymmdd_hhmm 

一种可能是使用maven-properties-plugin将所有项目属性存储到构build的.jar
然后,您可以使用标准(尽pipe不太实际) Java属性API来读取这些属性。

  <!-- Build properties to a file --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <phase>generate-resources</phase> <goals> <goal>write-project-properties</goal> </goals> <configuration> <outputFile> ${project.build.outputDirectory}/build.properties </outputFile> </configuration> </execution> </executions> </plugin> 

请小心这种方法,因为它可能泄漏不应该最终发布的属性,也可能来自settings.xml

要添加到Sean的答案,您可以使用资源内的targetpath参数将版本文件移动到jar中的文件夹位置。 以下代码在jar中创build一个名为“resources”的文件夹,并在该文件夹中find文本文件(version.number)。

 <resource> <directory>resources</directory> <targetPath>resources</targetPath> <filtering>true</filtering> <includes> <include>version.number</include> </includes> </resource> <resource> <directory>resources</directory> <filtering>false</filtering> <excludes> <exclude>version.number</exclude> </excludes> </resource> 

我只是用一个ant的任务做到这一点。

 <echo file="version.txt">${project.version}</echo>