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.
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>
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
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
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>
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
Ich habe das nur mit einer Ameisenaufgabe gemacht.
<echo file="version.txt">${project.version}</echo>
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
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>
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
.
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>
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>