javaはパスに追加します


0

ディレクトリにいくつかの.jarファイルがあります/home/unix/dfernand/bin/picard/picard-tools-1.106

しかし、私はにディレクトリを追加するときPATHCLASSPATH、私のbashrcに、Javaはまだ.jarファイルを認識しないと、私はその理由は分かりません。

私が試してみました:

>export PATH="/home/unix/dfernand/bin/picard/picard-tools-1.106:$PATH"
> export CLASSPATH=$CLASSPATH:/home/unix/dfernand/bin/picard/picard-tools-1.106
> java -jar AddOrReplaceReadGroups.jar -h
Unable to access jarfile AddOrReplaceReadGroups.jar
>export CLASSPATH="/home/unix/dfernand/bin/picard/picard-tools-1.106:$CLASSPATH"
>java -jar AddOrReplaceReadGroups.jar -h
Unable to access jarfile AddOrReplaceReadGroups.jar

私が行った場合、

[niveum] dfernand> java -jar /home/unix/dfernand/bin/picard/picard-tools-1.106/AddOrReplaceReadGroups.jar -h

それは機能します! PATH/CLASSPATH

誰が私のバグがどこにあるのか考えていますか?に何か他のものを追加する必要がありPATH/CLASSPATHますか?間違った構文を使用していますか?

回答:


1

まず、2つの環境変数とその目的の違いを明確にしましょう。

PATHは、シェルによって実行可能ファイルを見つけるためにのみ使用されます。たとえばjavalsまたはbash。そのため、シェルがのような文句を言わない限り、それに触れる必要はありませんjava: command not found

CLASSPATHロードするクラスを見つけるためにJavaが使用しているものです。しかし、それは少し違ったから作品PATH:それは、単一のいずれかのパスを含める必要があり.class.zipまたは.jarファイル、もしくはワイルドカードを持つエントリ。

.jar、.zip、または.classファイルへのクラスパス。各クラスパスは、クラスパスの設定内容に応じて、ファイル名またはディレクトリで終わる必要があります。

  • .classファイルを含む.jarまたは.zipファイルの場合、クラスパスは.zipまたは.jarファイルの名前で終わります。

  • 名前のないパッケージの.classファイルの場合、クラスパスは.classファイルを含むディレクトリで終わります。

  • 名前付きパッケージの.classファイルの場合、クラスパスは「ルート」パッケージ(完全なパッケージ名の最初のパッケージ)を含むディレクトリで終わります。クラスパスエントリには、ベース名ワイルドカード文字を含めることができます。これは、ディレクトリ内のすべてのファイルのリストを拡張子.jarまたは.JARで指定するのと同等と見なされます。たとえば、クラスパスエントリfoo /は、fooという名前のディレクトリ内のすべてのJARファイルを指定します。*のみで構成されるクラスパスエントリは、現在のディレクトリ内のすべてのjarファイルのリストに展開されます。

*を含むクラスパスエントリは、クラスファイルと一致しません。単一のディレクトリfoo内のクラスとJARファイルの両方を一致させるには、foo; foo / *またはfoo / *; fooを使用します。選択した順序によって、fooのJARファイルの前にfooのクラスとリソースがロードされるか、またはその逆かが決まります。

この場合、AddOrReplaceReadGroups.jarファイルへのパスを追加し、CLASSPATH完全なパッケージ名でクラスを呼び出してアプリケーションを起動する必要があります。呼び出されるクラスは、main()メソッドを含むクラスでなければなりません。この場合、そのクラスが何であるかわかりませんが、グーグル検索後の大げさな推測は、呼び出すクラスがであるということですnet.sf.picard.sam.AddOrReplaceReadGroups

ただし、クラスがアーカイブファイル(.zipまたは.jarファイル)に格納されている場合、クラスパスエントリは.zipまたは.jarファイルへのパスです。たとえば、.jarファイルにあるクラスライブラリを使用するには、コマンドは次のようになります。

C:> java -classpath C:\ java \ MyClasses \ myclasses.jar utility.myapp.Cool

Oracle JavaSE7 docsからの引用:クラスパスの設定、意味のより完全な説明については、PATHおよびCLASSPATHに関するJavaチュートリアルも参照してください)

だから、へのパスを追加した後に使用するコマンドラインAddOrReplaceReadGroups.jarには、CLASSPATH次のようになります。

> java net.sf.picard.sam.AddOrReplaceReadGroups

それでも面倒な場合は、それをシェルaliasまたはスクリプトに入れることができます。

スクリプトアプローチを使用すると、環境変数にまったく触れることなく、質問で言及した作業コマンドラインをスクリプトに直接配置することもできます。Javaドキュメントによると、これは実際には好ましい方法のようです。おそらく少なくとも部分的にCLASSPATHは、クラスパスに記載されているすべての(無関係な)場所を訪れる必要があるため、グローバルに使用されるものに多くのものを置くとクラスローディングにオーバーヘッドが追加されるためです、ロードするクラスを見つけるためにも。ただし、多くの大規模なアーカイブでクラスパスが非常に長い場合を除き、これがデスクトップアプリケーションで問題になるかどうかはわかりません。グローバルに物事を追加することを避けることは、同じクラスの異なるバージョンが多くのアーカイブに含まれている場合、バージョンの競合も防ぎます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.