一回も披露したことのない豆知識

jdk 1.6.0.26のjarコマンドを使って、既存のjarファイルのマニフェストファイルを更新したいのですが、下記のように警告が表示されてしまいます。
(下記例は、既存のtest.jarにマニフェストファイルmanifest.txtを更新する例です)

>jar uvmf manifest.txt test.jar
2011/08/15 1:54:26 java.util.jar.Attributes read
警告: Duplicate name in Manifest: Main-Class.
Ensure that the manifest does not have duplicate entries, and
that blank lines separate individual sections in both your
manifest and in the META-INF/MANIFEST.MF entry in the jar file.
2011/08/15 1:54:26 java.util.jar.Attributes read
警告: Duplicate name in Manifest: Class-Path.
Ensure that the manifest does not have duplicate entries, and
that blank lines separate individual sections in both your
manifest and in the META-INF/MANIFEST.MF entry in the jar file.
マニフェストが更新されました。


ちなみに、既存のtest.jarのマニフェストファイルの内容は、下記のようになっており、
Main-Class: jp.main.MainClass
Class-Path: hello.jar

manifest.txtの内容は、下記のようになっています。
Main-Class: jp.main.MainClass
Class-Path: hello2.jar

つまり、Class-Pathの所を別なjarファイルに書き換えたいわけです。

上記のjarコマンドで、警告はでますが、実行するとhello2.jarが動作しているようなので、大丈夫なのですが、警告が出るということは、やり方が悪いのでしょうか?

A 回答 (2件)

ちょっと補足させて下さい。



注意を喚起すると書きましたが、なんか違うような気がしてきました。


前述したjarコマンドの処理内容を逆手に取ると、manifest.txtの中身は

Class-Path: hello2.jar

でも

Class-Path: hello2.jar
Main-Class: jp.main.MainClass
Class-Path: hello2.jar

でも結果は同じになる訳です。

で、後者の場合に「重複してます」という警告を出すという処理になっていると思われますが、それが微妙にバグってて、既存のマニフェストと指定のマニフェストで重複しているものに対しても警告が表示されているのではないかと思われます。


まあ何にしても気にする必要はないかと。
    • good
    • 0
この回答へのお礼

なるほど、納得しました。
丁寧な説明ありがとうございます。

お礼日時:2011/08/16 09:54

jarコマンドのmオプションは、既存のマニフェストファイルを指定されたマニフェストファイル(今回ではmanifest.txt)に置き換えるという挙動ではなく、「指定されたマニフェストファイル(manifest.txt)中に記述されている名前と値のペアを1つずつ、既存のマニフェストファイルに取り込んでいく」という挙動になります。



つまり今回の例で言うと、更新したいのはClass-Pathのみですから、manifest.txtの中身は

Class-Path: hello2.jar

だけでも大丈夫なわけです。


その取り込む処理の中で、存在しない名前:値のペアの場合は追加し、(今回のClass-Pathのように)存在してるペアの場合は上書きするという処理になります。

問題の「警告」ですが、上書きする際に「上書きました」という情報を親切に表示させているだけです。敢えて「警告」にしてるのは、ユーザが想定してない場合を考慮して、注意を喚起する為だと思われます。

ですので、全く気にする必要はないと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報