2009-04-20 15 views
24

私はJavaとSwing Application Frameworkを使ってデスクトップアプリケーションを開発しています。私はボックスについてのアプリケーションを持っていて、そのボックスにはどのバージョンのテストが行​​われているかの表示が含まれています。私の好みは、その値が自動的に変更されることです。私はCruiseControlを使用して、SVNへのコミットをトリガしたアプリケーションを構築しています。Javaアプリケーションでバージョン番号を処理するにはどうすればよいですか?

他人がこの仕事をするためにどのような仕組みですか?私のビルドプロセスでドロップすることができるボックスバージョン番号ライブラリまたはアリ関連ツールのセットはありますか?

私はデプロイメントオプションを探していませんし、とにかくアップデートなどを自動的にチェックするつもりはありません。私はちょうどバージョンが約ボックスにあると、信頼できる答えを得るテスターに​​尋ねることができるようにしたい。

答えて

25

私はApache Mavenを使用してビルドするとこの投稿を開始します。 Antや他のツールでも同様のことをすることができますが、これは私がmavenを使って行ったことです。

これを処理する最も良い方法は、プロジェクトのバージョンとサブバージョンリビジョンをビルド番号として使用することです。 Mavenからは、以下を含めることができます。これは$ {scm.revision}のようなSubversionリビジョン番号を与えます。

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-scm-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>getting-scm.revision</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>update</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

これを済ませたら、これを実装バージョンとしてjarファイルマニフェストの一部として使用します。

<plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.1</version> 
    <configuration> 
     <archive> 
     <manifestEntries> 
      <Implementation-Version>${this.version}.${scm.revision}</Implementation-Version> 
     </manifestEntries> 
     </archive> 
    </configuration> 
    </plugin> 

これについての素晴らしい事は、あなたが以下を使用してコードからこれをアクセスできることである。

Package p = getClass().getPackage(); 
String version = p.getImplementationVersion(); 

あなたの最後の番号が「1.0.13525」のような完全なビルド番号を与えることSubversionリビジョン。これを設定する方法の詳細については、blog postを参照してください。

+1

良い答えです。ありがとう。 – toolkit

+0

優秀! Antを使ってもできますか? (申し訳ありませんが、Javaの世界ではn00b) – Upendra

+2

p.getImplementationVersion();私はそれを呼び出すしようとするたびにnullを返し続けます – jonney

2

あなたはあまりにも複雑になっています。 SVNはバージョン番号をCVSのようにマクロとして提供します。

定数を含む単純なinverfaceを作成し、SVNはマクロを通じて、

public interface IVersionNumber { 
    public static final String version = "$Id$" ; 
} 

のようにあなたが

$のsvnとして、そのファイル上のキーワードを使用してSVNに伝える必要があることをインスタンス化していますpropset SVN:あなたはプロパティhereについて読むことができますキーワード "ID" IVersion.java

+0

ただファイルではありません。 SVNはそのファイルの最後のリビジョン番号を取得するマクロを提供します。私の目標は、コミットするたびにそのファイルに触れる必要がないことです。 –

+0

私はsvnrevisionを呼び出して私が望む価値を得る必要があります。その呼び出しをCruiseControlから発生させる方が良いでしょう。 –

+2

いいえ、キーワードの置換を設定するのは、まさにあなたが望むものです。あなたはファイルに触れる必要はありません。 SVNはそれを処理します。そして、SVNは原子リビジョンを使用するので、バージョン番号はすべての*ファイルに対して同じであることに注意してください。 –

7

ビルドスクリプトにバージョンを保持するプロパティファイルを作成させます。リビジョン#をSVNから直接取得することをお勧めします。このようにして、テストで参照することができます。このプロパティファイルをパッケージ化されたjarファイルに配置し、実行時に読み取ります。私たちは通常、主要なマイナーバージョンをant scrptのパラメータとして設定していますが、リビジョンはSVNによって自動的に管理され、参照のための一貫したビルド番号が与えられます。

このスニペットターゲットはsvnコマンドラインを実行し、一時ファイル(svndump)に出力します。 次に、xx.yy.zz文字列を作成し、後でjarにインクルードする別のファイルに配置します。 xx.yyは外部パラメータから取られていることに注意してください。これはメジャーマイナーバージョンです。私はSubversionのからリビジョン番号を取得またはシーケンスを使用するか、または、その後でタイムスタンプが、あなたが好きな今まで${buildNumber}プレースホルダを置き換えるために使用されbuildnumber-maven-pluginを使用しましたMavenので

<target name="getrev"> 
    <exec executable="svn" output="svndump"> 
     <arg value="info"/> 
     <arg value="${my.svn.url}"/> 
    </exec> 

    <property file="svndump"/> 
    <property name="my.build" value="${Revision}"/> 
    <property name="my.rev" value="${my.ver}.${my.build}"/> 
    <echo message="current revision is ${my.rev}"/> 

    <property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/> 
    <echo message="${my.rev}" file="${my.dir.projects}/revision"/> 

    <delete file="svndump"/> 
</target> 
+0

+1。私もこれを行う。 – Damo

+0

あなたのためにexecのことをすることができるSVN-Antというプロジェクトがあります。 –

+0

はい、svn-antもやります。私が試したときに覚えていますが、依存関係にはいくつかの問題がありました。たぶん今、それはもっと成熟していて、試してみる価値があります。 – Dima

3

。私は他のビルドツールと継続的なインテグレーションサーバにも同様の機能があると思います。 "<あなたのツール>ビルド番号"でお気に入りの検索エンジンを検索してください。

1

私たちは長い間、JReleaseInfoを使用してきました。 Antスクリプトで設定することができます(私たちのプロジェクトにはMavenは使用しません)。バージョン番号は自動的にバンプされます。また、すべての情報を含むクラスを生成する点で、いくつかの素晴らしい点があります。コード内でそのクラスを呼び出すだけで、コードを変更せずに文字列を使用できるようにするか、コマンドラインからクラスを呼び出してバージョン番号を出力することができます。

0

私はすべてをビルドするためにcruise controlAntを使用していますので、プロジェクトをビルドするためにant呼び出しに渡された${label}プロパティを使用して、少なくとも今は終了しました。私のantファイルでは、Ant "replace" taskを使用して、そのラベルを含むApplication.versionというaboutボックスリソースを保持するプロパティファイルを変更します。

私はlabel incrementerからsvn label incrementerに変更してから、そのようにsvnリビジョン番号を使用する予定です。ちょっとしたことがあり、クルーズコントロール設定ファイルを変更する必要があります。

関連する問題