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

san*_*anz 51 java maven-2 maven-assembly-plugin

我想生成一个zip文件,用maven更新应用程序.zip将托管在服务器上,我使用程序集插件生成zip.但是,我希望maven能够自动生成一个文本文件,该文件存储zip之外的当前版本号.这可能吗?

编辑:我成功地使用maven Assembly Plugin和两个描述符创建了两个自定义程序集.一个目录单一目标,它只是根据过滤创建一个带有更新版本.txt的文件夹.然后另一个具有单个目标的实际打包zip文件.这似乎非常不优雅,我想它不会正确地更新整个更新文件夹的maven repo.如果有更好的方法,请告诉我.

Sea*_*oyd 87

当然.在src/main/resources中的某处创建一个文本文件,调用它version.txt(或其他)

文件内容:

${project.version}
Run Code Online (Sandbox Code Playgroud)

现在在您的pom.xml中,在构建元素内部,放置此块:

<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>
Run Code Online (Sandbox Code Playgroud)

在每次构建之后,文件(您可以在目标/类中找到)将包含当前版本.

现在,如果您想自动将文件移动到其他位置,您可能需要通过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>
Run Code Online (Sandbox Code Playgroud)

  • @SeanPatrickFloyd你能解释为什么我需要filter = false for exclude和filtering = true for includes?这是什么意思? (3认同)
  • 您不必使用完整的单独操作移动文件.您可以指定`<targetPath>`. (3认同)
  • 我看到了一些不同的问题:目标/类中有 version.txt,但是,{project.version} 没有被 pom 文件中的实际版本替换。 (2认同)
  • 如果不使用ant run插件,这将是一个很好的解决方案。由于它使用 ant run 插件,因此无需资源过滤即可定义 echo 任务。 (2认同)

Pau*_*est 16

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

对于.war使用此配置:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1</version>
    <configuration>
        <archive>                   
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

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

另请参阅如何在运行Tomcat时获取软件包版本?


Jon*_*man 13

你所指的是过滤

您需要对特定资源启用过滤,然后使用${project.version}将作为构建的一部分替换的资源


小智 9

对于 Spring Boot 应用程序,请按照上面接受的答案进行操作,但是替换

${project.version}
Run Code Online (Sandbox Code Playgroud)

@project.version@
Run Code Online (Sandbox Code Playgroud)

这是文档的链接https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes#maven-resources-filtering


eka*_*gas 7

在Maven 3中,使用Sean的答案来创建你的version.txt文件,(我的在这里显示,以及构建日期和活动配置文件):

${project.version}-${profileID}
${buildDate}
Run Code Online (Sandbox Code Playgroud)

profileID为每个配置文件添加属性,例如:

<properties>
    <profileID>profileName</profileID>
</properties>
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

1.2.3-profileName
yymmdd_hhmm
Run Code Online (Sandbox Code Playgroud)

  • 我需要添加以下配置,因此这是互补的: &lt;configuration&gt; &lt;delimiters&gt; &lt;delimiter&gt;${*}&lt;/delimiter&gt; &lt;/delimiters&gt; &lt;/configuration&gt; 如以下帖子所示:https://stackoverflow。 com/questions/5340361/replace-task-in-maven-antrun-plugin?answertab=active#tab-top (2认同)

小智 6

您还可以使用Groovy脚本生成版本信息文件.我更喜欢这种方法,因为你不必在assembly-plugin的描述符中排除东西.您还可以使用此方法选择性地包含仅在从Jenkins/Hudson构建时可用的内容(例如,检查oug 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>
Run Code Online (Sandbox Code Playgroud)

然后你的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>
Run Code Online (Sandbox Code Playgroud)

最后你的程序集描述符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>
Run Code Online (Sandbox Code Playgroud)


小智 6

我只是用蚂蚁任务完成了这个。

<echo file="version.txt">${project.version}</echo>
Run Code Online (Sandbox Code Playgroud)