49

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 行に設定し、-classpath を介して java への引数としてクラスパスを設定します。) それは常にコンソールに行き着き、このエラーで手を投げます:

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

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

4

13 に答える 13

59

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

私が思い出したように、ディスク パスは、パスを指定する jar自体に対して相対的である可能性があります。したがって、次のManifest.mfようになります。

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

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

<jar destfile="pathing.jar">
  <manifest>
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
  </manifest>
</jar>
于 2008-10-14T16:52:51.930 に答える
20

Java 6 以降、クラスパスのワイルドカードを使用できます。

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

  • これはクラス ファイルとは一致しません (jar ファイルのみ)。両方を一致させるには、foo;foo/*またはを使用しますfoo/*;foo。順序によって、最初にロードされるものが決まります。
  • 検索は再帰的ではありません
于 2008-10-14T17:14:25.680 に答える
4

(実際にはDOSを意味しているわけではないと思いますが、cmd.exeを参照してください。)

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

コマンドラインの長さを制限するウィンドウには制限があります。WindowsNT+では、cmd.exeの場合は8kです。setコマンドにはその制限があります。setコマンドに8k以上のディレクトリがある可能性はありますか?ニック・ベラルディが提案したようにそれらを分割したとしても、あなたは運が悪いかもしれません。

于 2008-10-14T16:25:10.990 に答える
2

Java 9+ のパスの問題に新しいソリューションを導入してくれたRamanに感謝します。bootRunGradleによってすでに評価されているすべてのものを使用して、引数ファイルを使用してJavaを実行できるようにするタスクをハックしました。あまりエレガントではありませんが、機能しています。

// Fix long path problem on Windows by utilizing java Command-Line Argument Files 
// https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 
// The task creates the command-line argument file with classpath
// Then we specify the args parameter with path to command-line argument file and main class
// Then we clear classpath and main parameters
// As arguments are applied after applying classpath and main class last step 
// is done to cheat gradle plugin: we will skip classpath and main and manually
// apply them through args
// Hopefully at some point gradle will do this automatically 
// https://github.com/gradle/gradle/issues/1989 

if (Os.isFamily(Os.FAMILY_WINDOWS)) {
    bootRun {
        doFirst {
            def argumentFilePath = "build/javaArguments.txt"
            def argumentFile = project.file(argumentFilePath)
            def writer = argumentFile.newPrintWriter()
            writer.print('-cp ')
            writer.println(classpath.join(';'))
            writer.close()

            args = ["@${argumentFile.absolutePath}", main]
            classpath = project.files()
            main = ''
        }
    }
}

于 2019-03-22T13:03:16.480 に答える
1

私があなたの立場なら、MS からジャンクション ユーティリティをダウンロードします。 :\" と "c:\path2" を "y:\" に置き換えます。このようにして、 のアイテムごとに 4 文字を減らすことができますclasspath

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.

于 2008-10-14T18:08:48.800 に答える
0

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

私はあなたが試すことができる2つの暗示を持っています。まず、junitテストを実行する前に、script/ant_taskにクラスパス上のさまざまなクラスのJARを作成させることができます。次に、JARをクラスパスに配置できます。クラスパスは短くする必要があります。

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

于 2008-10-14T16:20:33.650 に答える
0

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

于 2008-10-14T17:21:10.407 に答える
0

あなたはこれを試すことができます


@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マシンで実行する必要があります)また、現在のコマンドプロンプトセッションに対してのみパスが設定されています

于 2012-07-10T15:04:08.210 に答える
0

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

于 2016-10-19T10:15:35.513 に答える
-2

それらを積み重ねてみましたか?

set CLASS_PATH = c:\path
set ALT_A = %CLASS_PATH%\a\b\c;
set ALT_B = %CLASS_PATH%\e\f\g;
...

set ALL_PATHS = %CLASS_PATH%;%ALT_A%;%ALT_B%
于 2008-10-14T16:20:21.873 に答える