web-dev-qa-db-ja.com

Windowsで長いJavaクラスパスを設定するには?

Windows XPコマンドラインは、クラスパスに非常に多くの要素が含まれています。特定のJUnitテストを手動で実行しようとしています。 :

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;....
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;....
...
C:\apps\jdk1.6.0_07\bin\Java.exe -client Oracle.jdevimpl.junit.runner.TestRunner com.myco.myClass.MyTest testMethod

(他のバリエーションでは、クラスパスをすべて1行に設定し、Javaへの引数として-classpathを介してクラスパスを設定しています。)これは常に、コンソールにこのエラーが表示されます。

The input line is too long.
The syntax of the command is incorrect.

これは、かなり大規模な既存のレガシープロジェクトをテストするJUnitテストです。そのため、ディレクトリ構造をより合理的なものに再配置する提案はありません。これらのタイプのソリューションは、現在のところ出ていません。私はこのプロジェクトに対して簡単なテストを作成してコマンドラインで実行しようとしており、コンソールが私を妨害しています。助けて!

40
Ogre Psalm33

この点で、Windowsコマンドラインは非常に制限されています。回避策は、「pathing jar」を作成することです。これはManifest.mfファイルのみを含むjarです。そのClass-Pathは、jarなどの長いリストのディスクパスを指定します。今度は、コマンドラインにpathing jarを追加します。クラスパス。これは通常、実際のリソースを一緒にパッケージ化するよりも便利です。

私が思い出すように、ディスクのパスはpathing jar自体に関連している可能性があります。したがって、Manifest.mfは次のようになります。

Class-Path: this.jar that.jar ../lib/other.jar

pathing jarに基本的なリソースが含まれている場合、あまり頻繁に変更されることはありませんが、おそらくビルドのどこかに生成したいでしょう。例えば:

<jar destfile="pathing.jar">
  <manifest>
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
  </manifest>
</jar>
53
Chris Noe

Java 6なので、 classpath wildcards を使用できます。

例:foo/*は、ディレクトリfoo内のすべての.jarファイルを参照します

  • これはクラスファイルと一致しません(jarファイルのみ)。両方に一致させるには、foo;foo/*またはfoo/*;foo。順序によって、最初にロードされるものが決まります。
  • 検索は再帰的ではありません
20
johnstok

Java 9+で「引数ファイル」を使用する

Java 9 +、Java実行可能ファイルは、ファイルを介した引数の提供をサポートしています。 https://docs.Oracle.com/javase/ 9/tools/Java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111

このメカニズムは、コマンド長に関するOSの制限の問題を解決することを明確に意図しています。

@argumentファイルを使用して、Javaに渡されるオプションやクラス名などの引数を含むテキストファイルを指定することにより、Javaコマンドを短縮または簡略化できます。 =コマンドこれにより、Java任意のオペレーティングシステムで任意の長さのコマンドを作成できます。

コマンドラインで、アットマーク(@)プレフィックスを使用して、Javaオプションとクラス名を含む引数ファイルを識別します。Javaコマンドがアットマーク(@)で始まるファイルは、コマンドラインで指定されるのと同じように、そのファイルの内容を引数リストに展開します。

バージョン9以降を実行している場合、これは「正しい」ソリューションです。このメカニズムは、引数がJVMに提供される方法を変更するだけであるため、クラスロードの方法に関係なく、はフレームワークまたはアプリケーションと100%互換性があります。通常のコマンドラインの引数。これは、このOSの制限に対するマニフェストベースの回避策には当てはまりません。

この例は次のとおりです。

元のコマンド:

Java -cp c:\foo\bar.jar;c:\foo\baz.jar

次のように書き換えることができます。

Java @c:\path\to\cparg

どこ c:\path\to\cpargは以下を含むファイルです。

-cp c:\foo\bar.jar;c:\foo\baz.jar

この「引数ファイル」は、パス内のスペースを適切に処理するために、行継続文字と引用符もサポートしています。

-cp "\
c:\foo\bar.jar;\
c:\foo\baz.jar"

グラドル

Gradleでこの問題が発生している場合は、このプラグインを参照してください。このプラグインは、クラスパスを自動的に「引数ファイル」に変換し、Windowsでexecまたはテストタスクを実行するときにJVMに提供します。 Linuxまたは他のオペレーティングシステムでは、デフォルトでは何もしませんが、OSに関係なくオプションの構成値を使用して変換を適用できます。

https://github.com/redocksoft/classpath-to-file-gradle-plugin

(免責事項:私は著者です)

この関連するGradleの問題も参照してください-この機能が最終的にGradleコアに統合されることを願っています: https://github.com/gradle/gradle/issues/1989

6
Raman

(あなたは本当にDOSを意味しないと思うが、cmd.exeを参照する。)

環境のサイズ/環境変数のサイズ制限よりもCLASSPATHの制限の方が少ないと思います。 XPでは、個々の環境変数のサイズは8kであり、環境全体は64kに制限されています。あなたがその限界に達することを見ることができません。

コマンドラインの長さを制限するウィンドウには制限があり、WindowsNT +ではcmd.exeの場合は8kです。 setコマンドにはその制限が適用されます。 setコマンドで8k以上のディレクトリを使用できますか?あなたは運が悪いかもしれません-それらをあなたが Nick Berardi のように分割したとしても。

4
Tomalak

私があなたの靴を履いているなら、私はジャンクションユーティリティをMSからダウンロードします: http://technet.Microsoft.com/en-us/sysinternals/bb896768.aspx 「パス」、「z:\」、「c:\ path2」、「y:\」と言います。これにより、classpathのアイテムごとに4文字削減されます。

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;

これで、クラスパスは次のようになります。

set CLASS_PATH=z\a\b\c;z\e\f\g;
set CLASS_PATH=%CLASS_PATH%;y:\a\b\c;y:\e\f\g;

実際のclasspathに応じて、さらに多くのことが行われます。

1
anjanb

HuibertGillが言及しているように、これをAntビルドスクリプトでラップして、すべてを自分で管理する必要がないようにします。

0
matt b

ここでパドルなしで小川に上がっていると思います。コマンドラインには、プログラムを呼び出す引数に制限があります。

私はあなたが試すことができる2つのサジェスチョンを持っています。最初に、junitテストを実行する前に、script/ant_taskにクラスパス上のさまざまなクラスのJARを作成させることができます。その後、クラスパスにJARを配置できます。これは短くする必要があります。

試すことができるもう1つの方法は、JUNITを実行するantscriptを作成することです。ANTでは、クラスパスエントリにそのような制限はありません。

0
Huibert Gill

Jarファイルを「C:\ jars」などのフォルダーに移動して、クラスパスを短くすること以外に、問題の解決策はありませんでした。

0
Snehal Masne

これを試すことができます


@echo off
set A=D:\jdk1.6.0_23\bin
set B=C:\Documents and Settings\674205\Desktop\JavaProj
set PATH="%PATH%;%A%;"
set CLASSPATH="%CLASSPATH%;%B%;"

コマンドプロンプトに移動して2回実行します(理由はわかりません... Windowsではそうする必要がありますXPマシン)また、現在のコマンドプロンプトセッションにのみ設定されたパスr

0
Shivananda Sahu