【先着1,000名様!】1,000円分をプレゼント!

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が動作しているようなので、大丈夫なのですが、警告が出るということは、やり方が悪いのでしょうか?

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「メイン・マニフェスト属性がありません」というエラ

 こんにちは。

 eclipse 3.1でjarファイルをエクスポートして、コマンドプロンプトから実行しましたが、
「●●.jarにメイン・マニフェスト属性がありません」というエラーが出ました。

 web等で検索して、その通りにエクスポートして、エラーもなくエクスポートされたようなのですが
エラーの意味が分かりません。

Aベストアンサー

JARファイルのマニフェストファイルを作成するときにメインクラスを指定し忘れているに1票。
JARファイルの中のマニフェストファイルにMain-Class属性が正しく入っているか確認してください。

コマンドラインでunzipが使える環境なら
$ unzip -p ●●.jar META-INF/MANIFEST.MF
でマニフェストファイルの内容を表示できます。

メインクラスの指定は、http://sunjava.seesaa.net/article/57546363.htmlを例にすると【7】の画面で行います。
この画面に行かなくてもJARファイルは作れてしまう点に注意。

Qmain()を持つクラスが2つ以上あるexecutable jar

main()を持つクラスが2つ以上あるexecutable jar
を作成して、
main()を持つクラスを
必要に応じて、起動仕分けることは
可能なのでしょうか?

もし、可能であるとすれば
マニフェストファイルには
どのように記述すればよいのでしょうか?

そして、
java -jar
コマンドで起動するときにどのようにすればよいのでしょうか?


不可能であれば不可能であるということを
教えてください。

以上

Aベストアンサー

マニフェストファイルを用意しなくても、クラス名を直接指定する通常のコマンド形式
java -classpath <jarファイル名> <mainがあるクラス名> <コマンドライン引数>
で <mainがあるクラス名> を変えれば起動仕分けることは可能です。

マニフェストファイルには Main-Class 属性を一つしか定義できないので、クラス名を指定しない
java -jar <jarファイル名> <コマンドライン引数>
の形式で起動仕分けることは出来ないと思います。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q.jarファイルの中身って書き換えれる?

htmlを書くのがせいぜいの素人です。

今借りてるスペースでチャットを置こうと思って、配布されていたスクリプトをダウンロードさせてもらってきたのですが、ブラウザ画面右クリックで出てくる小窓に書かれている著作権表示がデッドリンクでした。(サイト移転前のURLが書いてあった。)
配布元サイトの掲示板にも要望として書き込んでみたのですが、何年もずっと放置状態のようで^^;

検索してみたら解凍するとかしないとか書いてあるんですけど、具体的にどうやったらいいのか分からないです。
普段htmlを書いているテキストエディタで対処できるなら方法を教えて下さい。よろしくお願いします。

Aベストアンサー

私も一年前まではコンパイルなんて知りませんでした^^その都度覚えていけばいいんですよ^^
「コンパイル」ってのは、わかりやすく言うと、ソースコード(テキストエディタで編集できるやつ。「*.java」など。)を機械が分かる機械語に変換することです。ですから、コンパイル済みのファイル(Javaだったら「*.class」みたいな。)をテキストエディタで開くと文字化けして意味が分からない文字の羅列になります。
No.1さんの回答は、そのコンパイル済みのファイルを直接編集しようとしてるみたいなのでちょっとちがいます。私のはコンパイル済みのファイルを逆コンパイル(機械語→ソースコードに変換)、もう一度ソースコードに戻して編集する、ということです。

>配布元サイトさんの更新は何年も前にキレイにストップしてるようですが、いちおうメールを出して尋ねてみました。
そうですね。それがいいと思います。
それでもダメなら、別のスクリプトを使ってみてはどうですか?

QEclipseで、配布可能なJARファイルを作成する方法が解りません。

Eclipseで、何も無いウインドウを開くというだけのアプリケーションを作ろうとしました。
ライブラリに、
org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar
を追加しております。

配布できる形式にしたいため、Jarファイルを作成しました。
プロジェクトにMETA-INFというフォルダを作成し、そこに「Manifest.mf」というファイルを作成し、以下のように記述しました。

Manifest-Version: 1.0
Class-Path: "C:\eclipse\plugins\org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar"
Main-Class: view.TestWindow

ちなみに、「view.TestWindow」というのがmainメソッドのあるクラスの名前です。

JARファイルをエクスポートして、コマンドライン上から以下のように入力しました。

> java -jar TestWindow.jar

結果は、以下のようなエラーが表示されました。

Failed to load Main-Class manifest attribute from
TestWindow.jar

多分、「Main-Class」の情報がマニフェストファイルから見つからないと言っているんだと思いますが、Eclipse上からエクスポートする際にはちゃんと場所を指定しています。何が問題なのか解りません。

将来的には、違うマシン上で動作するアプリケーションを作りたいと思っているのですが、最初でいきなり躓いてしまいました。
どなたか教えて頂けないでしょうか。

Eclipseで、何も無いウインドウを開くというだけのアプリケーションを作ろうとしました。
ライブラリに、
org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar
を追加しております。

配布できる形式にしたいため、Jarファイルを作成しました。
プロジェクトにMETA-INFというフォルダを作成し、そこに「Manifest.mf」というファイルを作成し、以下のように記述しました。

Manifest-Version: 1.0
Class-Path: "C:\eclipse\plugins\org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar"
Main-Class: view.Tes...続きを読む

Aベストアンサー

swtのライブラリを使用するためのマニフェストファイルの書き方について、過去に調査、回答いたしました。

http://okwave.jp/qa2457294.html

関連知識としてご参考いただければ幸いです。

Q実行時のNoClassDefFoundErrorが解決できません

Windows で コマンドプロンプトから Java のプログラム実行時に
NoClassDefFoundError が発生する問題で
Web 等を参考にいろいろ対処してみたのですが、
どうしても解決しないでいます。

JDK, JRE は 1.6.0_01 を以下にインストールしており、
C:\Program Files\Java\jdk1.6.0_01
C:\Program Files\Java\jre1.6.0_01

C:\Program Files\Java\jdk1.6.0_01\bin にPATHを通しています。
CLASSPATH 環境変数は設定していません。
その上で、以下のことをやりました。

(1) HelloWorld.java というファイルを D:\test フォルダに作成する。
  内容は以下の通り。

HelloWorld.java
-------------------------------------------------------------------------------
package testpackage;

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
-------------------------------------------------------------------------------

(2) コマンドプロンプトで D:\test に移動し、以下を実行する。

javac HelloWorld.java
(正常終了し、HelloWorld.class が D:\test に作成されたことを確認)

(3) 引き続きコマンドプロンプトで、以下を実行する。(例外が発生)

java HelloWorld
-------------------------------------------------------------------------------
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: testpackage/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
-------------------------------------------------------------------------------

Web の情報を参考に

java -cp . HelloWorld
java -cp D:\test HelloWorld

も実行してみましたが、同様の結果でした。

(4) 試しに以下も実行してみました。

javap HelloWorld
-------------------------------------------------------------------------------
Compiled from "HelloWorld.java"
public class testpackage.HelloWorld extends java.lang.Object{
public testpackage.HelloWorld();
public static void main(java.lang.String[]);
}
-------------------------------------------------------------------------------


以上です。
これ以上の対処方法が全く思い当たらない状態なのですが、
原因のわかる方がいらっしゃいましたらお願いします。

Windows で コマンドプロンプトから Java のプログラム実行時に
NoClassDefFoundError が発生する問題で
Web 等を参考にいろいろ対処してみたのですが、
どうしても解決しないでいます。

JDK, JRE は 1.6.0_01 を以下にインストールしており、
C:\Program Files\Java\jdk1.6.0_01
C:\Program Files\Java\jre1.6.0_01

C:\Program Files\Java\jdk1.6.0_01\bin にPATHを通しています。
CLASSPATH 環境変数は設定していません。
その上で、以下のことをやりました。

(1) HelloWorld.java というファ...続きを読む

Aベストアンサー

Javaのクラスファイルは、packageの階層と同じディレクトリ構造にしないといけません。

質問者さんの例なら、D:\testの下にtestpackageというディレクトリを作り、
その中にコンパイルしたHelloWorld.classを入れます。
そして、D:\test からコマンドプロンプトで

java testpackage.HelloWorld
もしくは
java testpackage/HelloWorld

で起動できます。

QJARファイルをEclipseを使って作成したのですが、ダブルクリック

JARファイルをEclipseを使って作成したのですが、ダブルクリックで起動することができません。デスクトップにJARファイルを保存したので、コマンドプロンプトでデスクトップまで階層を移動して"java -jar Sample.jar"と入力した時は問題なく起動できたのですが、ファイル自体をダブルクリックで起動がどうしてもできません。



初歩的なことかと思いますが、何卒よろしくお願いいたします。

Aベストアンサー

同じようなことで悩んだことがあります。
以下のURLのページで解決しました。

質問者さんも同じようなエラーが出ているようですので
もしかしたら解決できるかも。

参考URL:http://www.searchman.info/tips/2130.html

QString型の日付(2005/11/25)の比較

Java初心者です。String型で2005/11/25 のように2つString型で日付を取得したときに、大小の比較をしたいのです。どういう方法が考えられますか?よろしくお願いします。

Aベストアンサー

書式がyyyy/mm/ddで決め打ちならば他の方が書かれているとおりString#compareTo()で充分でしょう。
yyyy/m/dなど書式が不定の場合には、java.text.DateFormatを利用してjava.util.Dateに変換して比較するか、/で文字列を分解し、年・月・日を抽出してそれぞれを比較するなどが考えられます。

Qjarファイルをダブルクリックで実行

jarファイルをコマンドプロンプトから実行することは可能なのですが
ダブルクリックをすると「could not find class.program will exit」という
メッセージが出て実行できません。
自分の作ったファイルが悪いのかと思い
http://cafe.justsystem.co.jp/Tips/javaapp/helloworldicojar/#execfail
で紹介されているHelloWorld.jarもダブルクリックでは実行することが出来ませんでした。

ダブルクリックで実行するためには何か特別な設定をする必要があるのでしょうか?
自分なりに過去ログを見たのですがわからないのでよろしくお願いします。

Aベストアンサー

>jarファイルの関連付けは「Java(TM) 2 Platform Standard Edition binary」となっています

もっと詳細に調べる。

「フォルダオプション」

「ファイルの種類」

拡張子「JAR」を選択した状態で「詳細設定」

アクション「open」を「編集」

「アクションを実行するアプリケーション」
のところに書かれている"コマンド"が
適切かどうかチェックする。


それを#1さんのリンク先の内容と照らし合わせる。

QシェルからJavaを起動したい

シェルからJavaを起動したい
上記ですけど、Linuxで毎回「java パッケージ名.クラス名」を打つのは面倒なので、
シェルスクリプトのファイルを作って、それを実行するだけで起動できるようにしようと思っています。
が、クラスが見つからないってエラーが出て実行できませんでした。
(「java パッケージ名.クラス名」を実行しているディレクトリにシェルを作ってます)
恐らく環境変数などの設定がシェルの中にいるのではないかと思いますが、
シェルスクリプトとかLinuxの環境には疎い為、どういった記述が必要なのか解りません。
どなたか例を提示して頂けないでしょうか?

ちなみに、一般的なJavaの環境変数や、
プロジェクト特有・jarファイル等の環境変数は設定済みです。


それから、シェルは以下のように記述してます。

#!/bin/sh
java パッケージ名.クラス名


よろしくお願いします。

Aベストアンサー

状況が明確でないので可能性の一つというだけで役に立たないかもしれないが、
そのシェルスクリプトが存在しているディレクトリをカレントディレクトリにして、

java パッケージ名.クラス名

をコマンドラインで直接打てば動作しており、
また、そのカレントディレクトリでスクリプトを実行した場合にも実行できるが、
他のディレクトリからスクリプトを実行した場合にはクラスが見つからないというエラーになるという状況なら、
クラスパスにそのJavaクラスファイル(のトップ階層)へのパスを追加するか、
スクリプト内でカレントディレクトリを変更するかする必要がある。

例えばディレクトリ構成が、

/a/b/c/シェルスクリプトファイル
/a/b/c/パッケージ名/クラス名.class

になっていて、/a/b/cをカレントディレクトリにして、

java パッケージ名.クラス名

で直接実行したり、シェルスクリプトを起動した場合は実行できて、
他のディレクトリをカレントディレクトリにして実行権限をつけたシェルスクリプトを

/a/b/c/シェルスクリプト

/a/b/c を検索パスに追加しているならシェルスクリプト名だけ

で実行しようとした時にクラスが見つからない場合は、

#!/bin/sh
java -cp /a/b/c パッケージ名.クラス名

のように/a/b/cをクラスパスに指定する。
他にもクラスパスを設定しているならそれも込みでクラスパスを設定する。
スクリプトが置かれているディレクトリがスクリプト実行時のカレントディレクトリに勝手になるわけではない。

もしくは、Javaプログラムの実行中のカレントディレクトリが、
スクリプトが置かれているディレクトリであることを前提にプログラムが作られていたりするのなら(そうでない場合でもいいが)、
javaコマンドを実行する前にカレントディレクトリを変更するようにスクリプトを書く。

状況が明確でないので可能性の一つというだけで役に立たないかもしれないが、
そのシェルスクリプトが存在しているディレクトリをカレントディレクトリにして、

java パッケージ名.クラス名

をコマンドラインで直接打てば動作しており、
また、そのカレントディレクトリでスクリプトを実行した場合にも実行できるが、
他のディレクトリからスクリプトを実行した場合にはクラスが見つからないというエラーになるという状況なら、
クラスパスにそのJavaクラスファイル(のトップ階層)へのパスを追加するか、
スク...続きを読む


人気Q&Aランキング