まず、2つの環境変数とその目的の違いを明確にしましょう。
PATH
は、シェルによって実行可能ファイルを見つけるためにのみ使用されます。たとえばjava
、ls
または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
は、クラスパスに記載されているすべての(無関係な)場所を訪れる必要があるため、グローバルに使用されるものに多くのものを置くとクラスローディングにオーバーヘッドが追加されるためです、ロードするクラスを見つけるためにも。ただし、多くの大規模なアーカイブでクラスパスが非常に長い場合を除き、これがデスクトップアプリケーションで問題になるかどうかはわかりません。グローバルに物事を追加することを避けることは、同じクラスの異なるバージョンが多くのアーカイブに含まれている場合、バージョンの競合も防ぎます。