本ブログの更新について

 本ブログの更新は2016年3月31日をもって終了しました.ありがとうございました.
posted by みっちぃ (管理人)

2008年01月28日

Java嫌いになりそう

 なんだか調子狂うなぁ〜. このブログで公開しているJPEG GPX Mergerのなのですが・・・,
===========================
//旧ソースの一部(Ver.1.3.1)
public class JpegGpxMergerMain {

  public static final String DEF_VERSION = "1.3.1";

}
---------------------------
public class AboutDialog extends JDialog {

  public AboutDialog(JFrame owner)
  {
    super(owner, "About JPEG Gpx Merger", true);
    
    String strVersion ="Version:"+JpegGpxMergerMain.DEF_VERSION;
  }
}
===========================
//新ソースの一部(Ver.1.3.2)
public class JpegGpxMergerMain {

  private static final int[] DEF_VERSION = {1,3,2};

  public static String getVersion()
  {
    return JpegGpxMergerMain.DEF_VERSION[0]+"."
        +JpegGpxMergerMain.DEF_VERSION[1]+"."
        +JpegGpxMergerMain.DEF_VERSION[2];
  }
}
---------------------------
public class AboutDialog extends JDialog {

  public AboutDialog(JFrame owner)
  {
    super(owner, "About JPEG Gpx Merger", true);
    
    String strVersion ="Version:"+JpegGpxMergerMain.getVersion();
  }
}
===========================
※strVersionは,実際にはJLabelに渡されてダイアログ画面上に表示される.

 んで,AntでビルドしてMain-Class指定のマニフェストファイルを含むjarを作成.もちろんビルドするときにはビルド先をクリーンアップしている.jarファイルを生成するときはJpegGpxMerger-1.3.2jpn.jarのように名前を変えたりしている.いままで何度かリリースしたので,吐き出し先のディレクトリには他のバージョンのファイル(JpegGpxMerger-1.3.1jpn.jarなど)がある.
 ここで,作成されたJpegGpxMerger-1.3.2jpn.jarをWindows上でダブルクリックで実行する.JRE Version 6 Update 3のjavaw.exeが起動してJPEG GPX Mergerが起動される.そしてAboutDialogを表示するところで意図しない結果が返ってくる.strVersion に異なる値が入っているのだ.具体的には「Version:1.3.1」となっていて異なるバージョンとなっていまっている.
 同じディレクトリにある別のjarファイルを読み込んでしまいクラスが競合しているのだろうか?実際,JpegGpxMerger-1.3.2jpn.jarを個別のディレクトリに移して実行すれば正しく動作する. 競合しているというのは間違えがなさそう.(※1)
 何が競合しているのだろうか?JpegGpxMergerMainはMain-Class指定しているのだから,これはJpegGpxMerger-1.3.2jpn.jarのものが読み込まれているはず.ならば異なるバージョンのAboutDialogが読み込まれているに違いない.この仮定を確かめるために1.3.2のソースのAboutDialogで"Version:"のコロンをとってみた. 改めてAntでビルドして実行すると「Version 1.3.1」となった. ん?ということは,AboutDialogは正しくロードされている?
 んじゃ,正しくロードされていないのはJpegGpxMergerMainの方なのか?でもそうだとしたら,AboutDialogが呼び出しているJpegGpxMergerMain.getVersion()はどこから・・・? まぁ,とりあえず試してみよう. 今度はJpegGpxMergerMainのgetVersion()なかのreturnで生成している文字列のドットをハイフン「-」にしてみた. 旧バージョンがロードされているなら「Version 1.3.1」のままになるはず.しかし,今度は「Version 1-3-1」となった. ん?ということは,JpegGpxMergerMain.getVersion()も正しく読み込まれて機能していることになる.
 ますます訳分らなくなった. getVersion()はDEF_VERSIONを参照するが,DEF_VERSIONがintの配列になっていることを前提としている. もし,旧バージョンのDEF_VERSIONを参照しているならば,それは文字列なのだから何らかの例外が発生するのではないか?
 まぁいいさ.とりあえず正しく動いてくれれば理由はいいや. ならば今度は,JpegGpxMergerMainのDEF_VERSIONの変数名をDEF_VERSION_DIGITSに変えてみよう. もうこれで競合する部分はなくなったハズ. ところが・・・・.「Version 1-3-1」のまま.
 えぇ〜.なんでぇ〜?そんなにおかしな事やっているのかなぁ〜自分.ちょっと頭を冷やそうか・・・.ちなみに,Ver.1.3.1以前はDEF_VERSIONは文字列のまま実装を変えていない.リリースのたびに文字列の中身を変えていた程度の変更だった.そのやり方では今回のようなことは起こらなかった.たとえ同一ディレクトリのなかに異なるバージョンのjarファイルが存在していたとしても.
 こんなJavaオンチな私にご指摘いただける方がいらっしゃるようでしたら,よろしくお願いします.
m(_ _)m

※:そもそもjavaw.exeで起動するとき,“-jar”で指定したものや,マニフェスト内のClass-Path:で指定したもの以外のjarファイルが勝手に読み込まれる仕様だっただろうか?もちろんCLASSPATHに競合しそうなjarファイルは指定されていない.ワイルドカードも使ってないし・・・.
posted by みっちぃ (管理人) at 01:40| Comment(0) | TrackBack(1) | 日記
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/10117866

この記事へのトラックバック

解決しました・・・.
Excerpt: 先日「Java嫌いになりそう」と題して,Javaプログラミングで問題を解決できずにハマっている旨を記しましたが,原因が判明しました.問題の犯人は,javawでもなく,他のバージョンのjarファイルで..
Weblog: おきらくプログラマー
Tracked: 2008-01-31 16:55