web-dev-qa-db-ja.com

mavenを使用してバージョン番号をテキストファイルに出力する

アプリケーションをMavenで更新するZipファイルを生成したい。 Zipはサーバーでホストされ、アセンブリプラグインを使用してZipを生成します。ただし、Mavenに、Zip以外の現在のバージョン番号を格納するテキストファイルを自動的に生成してほしい。これはどのように可能ですか?

編集:maven Assemblyプラグインと2つの記述子を使用して2つのカスタムアセンブリを作成しました。 1つはディレクトリ単一の目標を持ち、フィルタリングに基づいて更新されたversion.txtでフォルダーを作成するだけです。次に、1つの目標を持つ別のものが実際にZipファイルをパッケージ化します。これは非常に洗練されていないようで、更新されたフォルダ全体でMavenリポジトリを適切に更新しないと思います。これを行うためのより良い方法があれば、私に知らせてください。

49
sanz

確かに。 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>
87

標準の_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の実行時にパッケージバージョンを取得する方法 も参照してください。

16
Paul Verest

あなたが言及しているものは フィルタリング と呼ばれます

特定のリソースでフィルタリングを有効にし、ビルドの一部として置換される${project.version}を使用する必要があります

13
Jon Freedman

また、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>
6
DeusAquilus

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

私はこれを蟻の仕事でした。

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

Spring Bootアプリケーションの場合は、上記の受け入れられた回答に従いますが、代わりに

${project.version}

@project.version@

ここにドキュメントへのリンクがあります https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes#maven-resources-filtering

2
Vuong Ly

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

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

0
Ondra Žižka

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

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