2009-08-27 10 views
21

私はコンパイラの警告(JDK 1.5)でプロジェクトをコンパイルすると、悪いパス要素の警告がたくさん出ます:パスの警告が間違っていますが、どこから来ていますか?

Warning :: [path]不正なパス要素 "C:\ Users \ MyJava \ common \ lib \ junit.jar ":そのようなファイルまたはディレクトリ 警告:: [パス]不正なパス要素" C:¥Users¥User¥MyJava¥common¥lib¥jdom.jar ":そのようなファイルまたはディレクトリ 警告:: [パス]不正なパス要素 "C:\ Users \ User \ MyJava \ common \ lib \ xerces.jar":そのようなファイルまたはディレクトリがありません 警告:: [path]不正なパス要素 "C:\ Users \ MyJava \ common \ lib \ xml-apis.jar ":そのようなファイルやディレクトリはありません。

などがあります。

これはIDEA 8.1.3を使用しています。私はIDEAの設定(私はプロジェクト全体を覗いてしまった)のどこにいても、これらのファイルを指し示す場所は見つけられません。彼らはまったくその名前の下にもう存在しませんが、それを参照するものは何ですか?

答えて

26

私は@Yishaiがその権利を持っていると思います(私は彼にボールを転がしてもらえるように投票します)。私はいつもこれにぶつかります。 Java言語のひどい決定だと思ったところで、クラスパス設定をjarファイル内のMANIFESTファイルに入れることができると決めました。したがって、本質的に、Jarsは他の場所にある他のクラスやJARを指し示すファイルを内部に持つことができますが、他のものが存在しない場合は、取得しているような警告が表示されます。これらの警告は、コンパイルクラスパス上にあるJarファイルから出てきます。したがって、問題のあるjarファイルを追跡し、jarファイルの内容を抽出し、マニフェストファイルの "Class-Path"設定を削除して再作成することが本当に気になる場合は、何をする必要があります。何かこれのようなもの(最初にどこかの一時ディレクトリに移動する):

#Extract the jar file 
jar xvf myfile.jar 
rm myfile.jar 
emacs ./META-INF/MANIFEST.MF 

*Find the entry "Class-path:" and remove it completely and save the changes 

#Rebuild the jar file 
jar cvf myfile.jar ./* 

これはすべきことです!

クラスパスに何が起こっているのかを完全に制御したい場合は、これらのマニフェストファイルを検索して、クラスパスを混乱させないようにしなければならないので、あなたは知らない。

多分あなたはjarファイルのトンに目を通す必要がありますので、私は通常、私はそれらを見て支援するシェルループを使用して終了します。あなたは、一時ディレクトリに問題のすべての瓶をコピーして、この(bashの構文)のようなループを実行することができます:

その内容を抽出し、カレントディレクトリ内のすべてのJarファイルの名前を印刷し、とgrepます
for i in *.jar; do echo $i; jar xf $i; grep -i 'class-path' ./META-INF/MANIFEST.MF; done 

クラスパスエントリのマニフェストファイル出力内のjarファイルの名前の後に「クラスパス」の出力がある場合、Jarにはそのマニフェストにクラスパス設定があることを意味します。このようにして、Jarsが何を行動させる必要があるのか​​をうまく理解することができます。

+0

詳細をお寄せいただきありがとうございます! – Yishai

+0

良いアイデアですが、現在のディレクトリをJARの内容で汚染しています。 –

+0

@LawrenceDolだから、「問題のJarファイルをすべて一時ディレクトリにコピーできます...」 –

0

CLASSPATH環境変数とコンパイルオプションが設定されている場所を確認しましたか?

+0

はい、IDEAによって直接参照されるわけではありません(クラスパスを提供します)。 – Yishai

20

thisによると、サードパーティ製のJARファイルでは、マニフェストにこれらの参照があることが問題です。 -Xlint:-pathをコンパイル・パラメータに追加することで、メッセージを無効にすることができます。

0

問題のパス要素は、おそらくJARのマニフェストファイル内にあります。このシェルスクリプトを実行すると、マニフェストファイルのみが抽出され、クラスパスが表示されます。

for i in *.jar; do echo $i; /path/to/your/jdk/bin/jar xf $i META-INF/MANIFEST.MF; grep -i 'class-path' META-INF/MANIFEST.MF; done 
関連する問題