アプリケーションをMavenで更新するZipファイルを生成したい。 Zipはサーバーでホストされ、アセンブリプラグインを使用してZipを生成します。ただし、Mavenに、Zip以外の現在のバージョン番号を格納するテキストファイルを自動的に生成してほしい。これはどのように可能ですか?
編集:maven Assemblyプラグインと2つの記述子を使用して2つのカスタムアセンブリを作成しました。 1つはディレクトリ単一の目標を持ち、フィルタリングに基づいて更新されたversion.txtでフォルダーを作成するだけです。次に、1つの目標を持つ別のものが実際にZipファイルをパッケージ化します。これは非常に洗練されていないようで、更新されたフォルダ全体でMavenリポジトリを適切に更新しないと思います。これを行うためのより良い方法があれば、私に知らせてください。
確かに。 src/main/resourcesのどこかにテキストファイルを作成し、version.txt
(または何でも)
ファイルの内容:
${project.version}
次に、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>
ビルドのたびに、ファイル(ターゲット/クラスにあります)には現在のバージョンが含まれます。
ファイルを他の場所に自動的に移動する場合は、おそらく 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 code 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>
_
これにより、ビルド中にマニフェストが追加されます。または、_mvn war:manifest
_を呼び出すことができます
Tomcatの実行時にパッケージバージョンを取得する方法 も参照してください。
あなたが言及しているものは フィルタリング と呼ばれます
特定のリソースでフィルタリングを有効にし、ビルドの一部として置換される${project.version}
を使用する必要があります
また、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>
そして、pom.xmlのAssemblyプラグインプラグインは次のようになります。
<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's answer を使用してversion.txt
ファイルを作成します(ビルド日付とアクティブなプロファイルとともに、ここに表示されます):
${project.version}-${profileID}
${buildDate}
プロパティprofileID
を各プロファイルに追加します。例:
<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
私はこれを蟻の仕事でした。
<echo file="version.txt">${project.version}</echo>
Spring Bootアプリケーションの場合は、上記の受け入れられた回答に従いますが、代わりに
${project.version}
と
@project.version@
ここにドキュメントへのリンクがあります https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes#maven-resources-filtering
Seanの回答に追加するには、リソース内のtargetpathパラメーターを使用して、jar内のフォルダーの場所にバージョンファイルを移動できます。次のコードは、jar内に「resources」というフォルダーを作成し、そのフォルダー内にテキストファイル(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>
1つの可能性は、すべてのプロジェクトプロパティをビルドされた.jar
使用maven-properties-plugin
。
次に、標準を使用して(実用的ではありませんが)これらのプロパティを読み取ることができます 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>
このアプローチには注意してください。最終的に公開されるはずのないプロパティも、settings.xml
。
write-properties-file-maven-plugin の方が好きです。1つのファイルにすべてのmaven-project-propertiesが必要なわけではないからです:
<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>
Mavenの使用可能なプロパティを使用してテキストファイルを作成する場合は、Dr.Octoboz(ありがとう)が提案したとおりに実行できます。ファイル全体が上書きされるのは事実です。おそらく、これは将来の読者にとってより良いヒント(CDATAブロックを使用)です。
<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>