質問: javaクラスパス内のディレクトリにすべてのjarを含める クラスパス内のディレクトリ内にすべてのjarファイルを含める方法はありますか?私はjava -classpath lib/*.jar:. my.package.programを試していますが、これらのjarファイルに確実に含まれるクラスファイルを見つけることができません。各jarファイルをクラスパスに別々に追加する必要がありますか?
回答: java 6以降を使用して、classpathオプションはワイルドカードをサポートします。次の点に注意してください。 二重引用符を使用(") *ではなく*.jarを使用 windows java -cp "test.jar;lib/*" my.package.mainclass unix java -cp "test.jar:lib/*" my.package.mainclass これはwindowsと似ていますが、:の代わりに;を使用します。ワイルドカードを使用できない場合、bashでは次の構文を使用できます(libはすべてのjavaアーカイブファイルを含むディレクトリです)。 java -cp $(echo lib/*.jar | tr ' ' ':') (クラスパスを使用することは-jarオプションと互換性がないことに注意してください。参照: コマンドプロンプトから複数のクラスパスライブラリを含むjarファイルを実行 ) ワイルドカードについて classpath ドキュメントから: クラスパスエントリには、ベース名のワイルドカード文字*を含めることができます。これは、ディレクトリ内のすべてのファイルのリストを拡張子.jarまたは.jarで指定するのと同等と見なされます。たとえば、クラスパスエントリfoo/*は、fooという名前のディレクトリ内のすべてのjarファイルを指定します。単に*からなるクラスパスエントリは、現在のディレクトリ内のすべてのjarファイルのリストに展開されます。 *を含むクラスパスエントリは、クラスファイルと一致しません。単一のディレクトリfoo内のクラスとjarファイルの両方を一致させるには、foo;foo/*またはfoo/*;fooを使用します。選択された順序によって、foo内のクラスとリソースがfoo内のjarファイルの前にロードされるか、またはその逆かが決まります。 サブディレクトリは再帰的には検索されません。たとえば、foo/*はjarファイルをfooでのみ検索し、foo/bar、foo/bazなどでは検索しません。 ディレクトリ内のjarファイルが展開されたクラスパスに列挙される順序は指定されておらず、プラットフォームごとに、場合によっては同じマシン上でも変わる可能性があります。うまく構成されたアプリケーションは、特定の順序に依存してはいけません。特定の順序が必要な場合は、jarファイルをクラスパスに明示的に列挙できます。 ワイルドカードの拡張は、クラスローディングプロセス自体の間ではなく、プログラムのメインメソッドが呼び出される前に行われます。ワイルドカードを含む入力クラスパスの各要素は、指定されたディレクトリ内のjarファイルを列挙することによって生成された(おそらく空の)一連の要素に置き換えられます。たとえば、ディレクトリfooにa.jar、b.jar、およびc.jarが含まれている場合、クラスパスfoo/*はfoo/a.jar;foo/b.jar;foo/c.jarに展開され、その文字列はシステムプロパティjava.class.pathの値になります。 classpath環境変数は、-classpath(または-cp)コマンドラインオプションとの違いはありません。つまり、これらすべての場合にワイルドカードが使用されます。ただし、クラスパスのワイルドカードはclass-path jar-manifestヘッダーでは使用されません。 注:java 8の既知のバグのため、ウィンドウの例では末尾にアスタリスクを付けてエントリーの前にバックスラッシュを使用する必要があります。 https://bugs.openjdk.java.net/browse/jdk-8131329