Wie legt man einen langen Java-Klassenpfad in Windows fest?

Ich versuche, einen bestimmten JUnit-Test manuell in einer Windows XP-Befehlszeile auszuführen, die eine ungewöhnlich hohe Anzahl von Elementen im Klassenpfad enthält. Ich habe verschiedene Varianten ausprobiert, wie zum Beispiel:

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

(Andere Varianten setzen den Klassenpfad auf eine Zeile, wobei der Klassenpfad über -classpath als Argument für Java gesetzt wird.) Es kommt immer darauf an, dass die Konsole ihre Hände mit diesem Fehler hochwirft:

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

Dies ist ein JUnit-Test, der ein ziemlich großes existierendes Legacy-Projekt testet, also keine Vorschläge zum Umordnen meiner Verzeichnisstruktur zu etwas Vernünftigerem, diese Arten von Lösungen sind vorerst aus. Ich habe gerade versucht, einen schnellen Test gegen dieses Projekt durchzuführen und es in der Befehlszeile auszuführen, und die Konsole blockiert mich. Hilfe!

34

9 Antworten

Die Windows-Befehlszeile ist in dieser Hinsicht sehr einschränkend. Eine Problemumgehung besteht darin, ein "Pfad-Jar" zu erstellen. Dies ist ein jar, das nur eine Datei Manifest.mf enthält, deren Klassenpfad die Festplattenpfade Ihrer langen Liste von jars usw. angibt. Fügen Sie nun einfach hinzu pathing jar an Ihren Befehlszeilenklassenpfad. Dies ist normalerweise bequemer als die tatsächlichen Ressourcen zusammen zu packen.

Soweit ich mich erinnere, können die Festplattenpfade relativ zur Pfadangabe jar selbst sein. So könnte das Manifest.mf etwa so aussehen:

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

Wenn Ihr Pathing-Jar hauptsächlich grundlegende Ressourcen enthält, wird es sich nicht zu häufig ändern, aber Sie werden es wahrscheinlich immer noch irgendwo in Ihrem Build erzeugen wollen. Beispielsweise:


  
    
  

49
hinzugefügt
Muss ich etwas tun, z. B. sicherstellen, dass dieses Glas geladen ist? Oder wird die JVM alle für solche Manifeste auf dem Klassenpfad bereitgestellten Dateien scannen? Ist es auch über JVMs hinweg tragbar? Was ist die Mindestversion von Java, die dies unterstützt?
hinzugefügt der Autor bacar, Quelle
Die ManifestClassPath-Task, die in Ant seit Version 1.7 verfügbar ist, kann verwandt werden, um eine geeignete Eigenschaft für das Class-Path Attribut von einem Ant Path zu generieren.
hinzugefügt der Autor Matt Hurne, Quelle
Ich habe das versucht, aber das Manifest.mf erlaubt nur relative URLs zu anderen JARs und Verzeichnissen.
hinzugefügt der Autor xamde, Quelle

Seit Java 6 können Sie Klassenpfad-Platzhalter .

Example: foo/*, refers to all .jar files in the directory foo

  • Dies stimmt nicht mit Klassendateien überein (nur JAR-Dateien). Um beide zu verwenden, verwenden Sie foo; foo/* oder foo/*; foo . Die Reihenfolge bestimmt, was zuerst geladen wird.
  • Die Suche ist NICHT rekursiv
18
hinzugefügt
Dies scheint wie eine "Link Only-Antwort" zu sein. Sie sollten weitere Einzelheiten dazu angeben.
hinzugefügt der Autor rghome, Quelle
Hey, das ist cool - das wusste ich nicht. Das ist definitiv eine hilfreiche Option, besonders wenn (wie in unserem Fall) der Klassenpfad voll mit Gläsern ist, von denen sich viele im selben Verzeichnis befinden.
hinzugefügt der Autor Ogre Psalm33, Quelle
Dies scheint in Java 6 neu zu sein.
hinzugefügt der Autor Chris Noe, Quelle
Dies bietet jedoch kein rekursives Traversieren.
hinzugefügt der Autor Snehal Masne, Quelle

(Ich nehme an, Sie meinen nicht DOS, sondern verweisen auf cmd.exe.)

Ich denke, es ist weniger eine CLASSPATH-Einschränkung als eine Größenbeschränkung für Umgebungsgröße/Umgebungsvariable. Unter XP können einzelne Umgebungsvariablen 8 KB groß sein, die gesamte Umgebung ist auf 64 KB beschränkt. Ich kann nicht sehen, dass Sie diese Grenze erreichen würden.

Es gibt ein Limit für Windows, das die Länge einer Befehlszeile einschränkt, auf WindowsNT + ist es 8k für cmd.exe. Ein set-Befehl unterliegt dieser Einschränkung. Kann es sein, dass Sie in Ihrem Set-Befehl mehr als 8.000 Verzeichnisse haben? Sie können Pech haben, dann - selbst wenn Sie sie aufteilen wie Nick Berardi vorgeschlagen.

4
hinzugefügt
Woops, yeah, die Old-School dringt durch. Ja, cmd.exe.
hinzugefügt der Autor Ogre Psalm33, Quelle

Hast du versucht, sie zu stapeln?

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%
2
hinzugefügt
Wir haben versucht, ein paar Variationen, vergeblich. CMD scheint all diese% ALT_A% usw. während des Fluges zu ersetzen, und der letzte Pfad ist zu lang, als dass er es handhaben könnte, was mir den gleichen Fehler gibt.
hinzugefügt der Autor Ogre Psalm33, Quelle

If I were in your shoes, I would download the junction utility from MS : http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx and then map your "C:\path" to say, "z:\" and "c:\path2" to say, "y:\". This way, you will be reducing 4 characters per item in your 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;

Now, your classpath will be :

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

Je nach dem tatsächlichen classpath kann dies mehr tun.

1
hinzugefügt
Junction ist ein Frontend dafür in NTFS. mklink/D ist ein anderes, möglicherweise bereits in späteren Versionen von Windows vorhanden.
hinzugefügt der Autor mgaert, Quelle
mlink scheint nicht in Windows 7 enthalten sein. Junction ist als Teil von Windows 7 (Enterprise) enthalten.
hinzugefügt der Autor anjanb, Quelle

Wie HuibertGill erwähnt, würde ich dies in ein Ant-Build-Skript einfügen, so dass Sie das alles nicht selbst verwalten müssen.

0
hinzugefügt

Ich glaube, du bist ohne Paddel hier oben am Bach. Die Befehlszeile hat ein Limit für Argumente, um ein Programm aufzurufen.

Ich habe 2 Versuche, die Sie versuchen könnten. Zuerst können Sie vor dem Ausführen der Junit-Tests ein Skript/ant_task JARs der verschiedenen Klassen im Klassenpfad erstellen lassen. Dann können Sie die JARs auf den Klassenpfad setzen, der kürzer sein sollte.

Ein anderer Weg, den Sie versuchen könnten, ist ein Ameisenscript zu erstellen, um JUNIT auszuführen, in ANT sollte es keine solche Begrenzung für Klassenpfadeinträge geben.

0
hinzugefügt

Du könntest das versuchen


@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%;"

Gehe zu einer Eingabeaufforderung und führe es zweimal aus (keine Ahnung warum ... ich muss dies auf einem Windows XP-Rechner tun) Außerdem werden die Pfade nur für die aktuelle Eingabeaufforderungssitzung festgelegt

0
hinzugefügt

Es gab keine Lösung für dieses Problem, außer dass der Klassenpfad dadurch verkürzt wurde, dass die JAR-Dateien in einen Ordner wie "C: \ jars" verschoben wurden.

0
hinzugefügt
Falsch. Es gab eine andere Lösung, aber Sie wussten entweder nicht, was es war, oder Sie beschlossen, es nicht zu benutzen. Was Sie jedoch getan haben, war definitiv eine Lösung ... die unter Umständen funktionieren kann.
hinzugefügt der Autor Stephen C, Quelle