Javaプロジェクトでのバージョンの保存と出力

多くの人が、リリースされたjarまたはwarのバージョンを正確に知るタスクを持っていると思います。 そして、私は「単純なユーザー」がそのようなアーカイブのバージョンを決定できる方法を持ちたいです。 以下は、この問題を解決する方法です。



この方法は排他的であると主張するものではなく、確かに他のものもあります。

だから、問題の声明:



プロジェクトはmaven'omになります。 ソースはgitに保存されます。 プログラマはLinux上で動作します(Windowsの場合、適応するのは難しくありません)。 原則として、十分なツールがあります。 すべてをまとめるだけです。



アクションのアルゴリズムは次のとおりです。

  1. スクリプトはgitから情報を引き出し、ファイルに書き込みます
  2. ファイルからプロパティを読み取る
  3. アーカイブを作成するときにmanifest.mfにバージョン情報を書き込みます
  4. manifest.mfでクラスのバージョンを指定します
  5. Versionクラスで、mainメソッドを作成します。このメソッドでは、manifest.mfから情報を取得します




git




gitから情報を取得するには、別のプログラムcreaterepo.shを使用しますが、プロジェクトのルートにそれを置くだけです。

#!/bin/sh branch=`git branch|grep \*|cut -d" " -f 2` commit=`git id` echo "buildNumber=${branch}.${commit}" > "$1"
      
      







メイヴン




pom.xmlをカスタマイズします

gitからのバージョンの一時ファイル名を保存するプロパティを定義する必要があります。

 <properties> <versionfile>${project.basedir}/version.properties</versionfile> </properties>
      
      







スクリプトの起動

 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <workingDirectory>${project.basedir}</workingDirectory> <executable>/bin/sh</executable> <arguments> <argument>createprop.sh</argument> <argument>${versionfile}</argument> </arguments> </configuration> </plugin>
      
      







ファイルからバージョンを読み取る

 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.0-alpha-2</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> </goals> <configuration> <files> <file>${versionfile}</file> </files> </configuration> </execution> </executions> </plugin>
      
      







jarへの情報の書き込み

 <plugin> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> </manifest> <manifestEntries> <Implementation-Version>${project.version}-${buildNumber}</Implementation-Version> <Main-Class>ru.habrahabr.sandello.Version</Main-Class> </manifestEntries> </archive> </configuration> </plugin>
      
      







クリーニング中に一時ファイルを削除します

 <plugin> <artifactId>maven-clean-plugin</artifactId> <configuration> <filesets> <fileset> <directory>${project.basedir}</directory> <includes> <include>${versionfile}</include> </includes> </fileset> </filesets> </configuration> </plugin>
      
      







java




アーカイブバージョンを出力するバージョンクラスを作成する

 package ru.habrahabr.sandello ; import java.io.IOException; import java.io.InputStream; import java.util.jar.Attributes; import java.util.jar.Manifest; public class Version { public static void main(String[] args) { new Version().ver(); } private void ver() { final InputStream mfStream = getClass().getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF"); Manifest mf = new Manifest(); try { mf.read(mfStream); } catch (IOException e) { e.printStackTrace(); } Attributes atts = mf.getMainAttributes(); System.out.println("version: " + atts.getValue(Attributes.Name.IMPLEMENTATION_VERSION)); } }
      
      





すべて準備完了です。 プロジェクトをまとめる

mvn package.







その結果、実行できるアーカイブがあります

java -jar my.jar









もちろん、説明した方法には欠点がないわけではありません。 たとえば、java -jarメソッドを使用してターゲットプログラムを起動する必要がある場合、メソッドは機能しません。 変更する必要があります。引数などの処理を行います。 または、ターゲットプログラムは、Jbossまたはtomcatでレイアウトされたファイルのセットです。 また、記載されているソリューションを変更する必要があります。



All Articles