wake-up-neo.com

Verwenden von maven zur Ausgabe der Versionsnummer in eine Textdatei

Ich möchte eine Zip-Datei erstellen, die eine Anwendung mit Maven aktualisiert. Die Zip wird auf einem Server gehostet und ich benutze das Assembly Plugin, um die Zip zu generieren. Ich möchte jedoch, dass maven automatisch eine Textdatei generiert, in der die aktuelle Versionsnummer außerhalb der Zip-Datei gespeichert ist. Ist das möglich?

EDIT: Ich habe es erfolgreich mit dem Maven Assembly Plugin und zwei Deskriptoren durchgeführt, um zwei benutzerdefinierte Assemblys zu erstellen. Eines hat ein Verzeichnis-Einzelziel und es erstellt einfach einen Ordner mit der aktualisierten version.txt basierend auf Filterung. Dann packt eine andere Datei mit einem einzigen Ziel die Zip-Datei. Dies scheint sehr inelegant zu sein, und ich denke, es wird das Maven-Repo mit dem gesamten aktualisierten Ordner nicht richtig aktualisieren. Wenn es einen besseren Weg gibt, lass es mich wissen.

46
sanz

Sicher. Erstellen Sie eine Textdatei irgendwo in src/main/resources, nennen Sie sie version.txt (oder was auch immer)

Dateiinhalt:

${project.version}

fügen Sie nun in Ihrer pom.xml im Bauelement diesen Block ein:

<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>

nach jedem Build enthält die Datei (die Sie in target/classes finden) die aktuelle Version.

Wenn Sie die Datei automatisch an einen anderen Ort verschieben möchten, müssen Sie wahrscheinlich eine Ant-Task über das maven-antrun-plugin ausführen.

Etwas wie das:

  <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>
85

Verwenden Sie den Standardcode META-INF\MANIFEST.MF (Dann können Sie den Java-Code getClass().getPackage().getImplementationVersion() verwenden, um die Version abzurufen.)

Verwenden Sie für .war diese Konfiguration:

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

Das wird während des Builds Manifest hinzufügen, oder Sie können mvn war:manifest aufrufen.

Siehe auch So erhalten Sie die Paketversion beim Ausführen von Tomcat

14
Paul Verest

Worauf Sie sich beziehen, heißt Filterung

Sie müssen die Filterung für eine bestimmte Ressource aktivieren und dann ${project.version} verwenden, der als Teil Ihres Builds ersetzt wird

11
Jon Freedman

Sie können auch ein Groovy-Skript verwenden, um eine Versionsinfodatei zu erstellen. Diese Methode gefällt mir mehr, weil Sie keine Elemente im Deskriptor des Assembly-Plugins ausschließen müssen. Sie können diese Methode auch verwenden, um optional nur Elemente aufzunehmen, die von Jenkins/Hudson aus erstellt werden (z. B. BUILD_ID usw.).

In pom.xml haben Sie also ein grooviges Skript, das die Datei erzeugt:

  <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>

Und dann Ihr Assembly Plugin Plugin in pom.xml, das so aussehen würde:

  <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>

Und schließlich würde Ihr Assembly-Deskriptor dist-all.xml so aussehen:

<?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>
6
DeusAquilus

verwenden Sie in Maven 3 Seans Antwort , um Ihre version.txt-Datei zu erstellen.

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

hinzufügen der Eigenschaft profileID zu jedem der Profile, z.

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

Verwenden Sie Maven-Kopierressourcen, um die Datei in ein leichter zu erreichendes Verzeichnis wie ${basedir} oder ${basedir}/target zu kopieren:

<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>

die Ausgabe sieht folgendermaßen aus:

1.2.3-profileName
yymmdd_hhmm
6
ekangas

Ich habe das nur mit einer Ameisenaufgabe gemacht.

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

Befolgen Sie für eine Spring Boot-Anwendung die akzeptierte Antwort von oben, ersetzen Sie sie jedoch

${project.version}

mit

@[email protected]

Hier ist der Link zur Dokumentation https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes#maven-resources-filtering

1
Vuong Ly

Um Seans Antwort hinzuzufügen, können Sie die Versionsdatei mithilfe des Parameters targetpath in der Ressource in einen Ordner innerhalb der jar verschieben. Mit dem folgenden Code wird ein Ordner mit dem Namen "resources" innerhalb der jar erstellt, und die Textdatei (version.number) befindet sich in diesem Ordner. 

<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>
0
learmo

Eine Möglichkeit besteht darin, alle Projekteigenschaften mit .jar im erstellten maven-properties-plugin zu speichern.
Dann können Sie diese Eigenschaften unter Verwendung von Standard lesen (wenn auch nicht allzu praktisch) Java Properties 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>

Seien Sie vorsichtig mit diesem Ansatz, da dadurch Eigenschaften auslaufen können, die nicht veröffentlicht werden sollten, auch aus settings.xml.

0
Ondra Žižka

Ich bevorzuge das write-properties-file-maven-plugin , weil ich nicht alle maven-project-properties in einer Datei haben möchte:

  <plugin>
    <groupId>com.internetitem</groupId>
    <artifactId>write-properties-file-maven-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
      <execution>
        <id>one</id>
        <phase>compile</phase>
        <goals>
            <goal>write-properties-file</goal>
        </goals>
        <configuration>
          <filename>test.properties</filename>
          <properties>
            <property>
              <name>one</name>
              <value>1</value>
            </property>
            <property>
              <name>artifactId</name>
              <value>My Artifact ID is ${project.artifactId}</value>
            </property>
          </properties>
        </configuration>
      </execution>
    </executions>
  </plugin>
0
Gambotic

Wenn Sie eine Textdatei mit maven verfügbaren Eigenschaften schreiben möchten, können Sie den Vorschlag von Dr.Octoboz (danke) ausführen. Es stimmt, dass die gesamte Datei überschrieben wird. Vielleicht ist dies ein besserer Hinweis (verwenden Sie einen CDATA-Block) für zukünftige Leser.

<echo file="C:/var/install/myapp/${thisProfile}/${maven.build.timestamp}/myapp_install.txt"><![CDATA[
# Profile ${thisProfile}
bmix api https://api.eu-de.bluemix.net
bmix  login -u [email protected] -p "********"
bmix target --cf
bmix cf Push myapp1-${service} -p C:\var\install\myapp\${thisProfile}\${maven.build.timestamp}\myapp1.war
bmix cf Push myapp2-${service} -p C:\var\install\myapp\${thisProfile}\${maven.build.timestamp}\myapp1.war
]]></echo>
0
Marcos