Comment définir un classpath Java long dans Windows?

J'essaie d'exécuter un test JUnit particulier à la main sur une ligne de commande Windows XP, qui a un nombre anormalement élevé d'éléments dans le chemin de la classe. J'ai essayé plusieurs variantes, telles que:

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

(D'autres variantes définissent le classpath sur une seule ligne, définissant le classpath via -classpath comme un argument à Java). Il revient toujours à la console de lancer ses mains avec cette erreur:

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

Ceci est un test JUnit testant un projet hérité plutôt important, donc pas de suggestions sur la réorganisation de ma structure de répertoire à quelque chose de plus raisonnable, ces types de solutions sont pour le moment. J'essayais juste de lancer un test rapide sur ce projet et de le lancer en ligne de commande, et la console me bloque. Aidez-moi!

34

9 Réponses

La ligne de commande Windows est très limitative à cet égard. Une solution de contournement consiste à créer un "pot d'accès". Ceci est un jar contenant seulement un fichier Manifest.mf , dont Class-Path spécifie les chemins de disque de votre longue liste de jars, etc. Maintenant, ajoutez juste ce pathing jar à votre classpath de ligne de commande. Ceci est généralement plus pratique que d'emballer les ressources réelles ensemble.

Si je me souviens bien, les chemins du disque peuvent être relatifs au pathing jar lui-même. Ainsi, le Manifest.mf pourrait ressembler à ceci:

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

Si votre fichier pathar jar contient principalement des ressources de base, il ne changera pas trop souvent, mais vous voudrez probablement toujours le générer quelque part dans votre build. Par exemple:


  
    
  

49
ajouté
Ai-je besoin de faire quoi que ce soit, par exemple, de faire en sorte que ce pot soit chargé? Ou la JVM va-t-elle scanner tous les jars fournis sur le chemin de la classe pour de tels manifestes? En outre, est-il portable sur les machines virtuelles Java? Quelle est la version minimale de Java qui supporte cela?
ajouté l'auteur bacar, source
La tâche ManifestClassPath disponible dans Ant depuis la version 1.7 peut être utilisée pour générer une propriété appropriée pour l'attribut Class-Path à partir d'un chemin Ant.
ajouté l'auteur Matt Hurne, source
J'ai essayé ceci, mais le Manifest.mf autorise seulement des URL relatives à d'autres JARs et répertoires.
ajouté l'auteur xamde, source

Depuis Java 6, vous pouvez utiliser caractères génériques classpath .

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

  • cela ne correspondra pas aux fichiers de classe (uniquement les fichiers jar). Pour faire correspondre les deux, utilisez: foo; foo/* ou foo/*; foo . L'ordre détermine ce qui est chargé en premier.
  • La recherche n'est pas récursive
18
ajouté
Cela ressemble à une "réponse de lien seulement". Vous devriez fournir plus de détails sur la façon de s'y prendre.
ajouté l'auteur rghome, source
Hey, c'est cool - je ne savais pas à ce sujet. C'est certainement une option utile, surtout si (comme dans notre cas), le classpath est plein de jars, dont beaucoup sont dans le même répertoire.
ajouté l'auteur Ogre Psalm33, source
Cela semble être nouveau dans Java 6.
ajouté l'auteur Chris Noe, source
Mais ceci n'offre pas de traversée récursive.
ajouté l'auteur Snehal Masne, source

(Je suppose que vous ne voulez pas vraiment dire DOS, mais référez-vous à cmd.exe.)

Je pense que c'est moins une limite de CLASSPATH qu'une limite de taille variable d'environnement/taille d'environnement. Sur XP, les variables d'environnement individuelles peuvent avoir une taille de 8k, l'environnement entier est limité à 64k. Je ne peux pas voir que vous atteindriez cette limite.

Il y a une limite sur Windows qui limite la longueur d'une ligne de commande, sur WindowsNT + c'est 8k pour cmd.exe. Une commande set est soumise à cette restriction. Peut-il être que vous avez plus de 8k de répertoires dans votre commande set? Vous pourriez ne pas avoir de chance, même si vous les divisez comme Nick Berardi suggéré.

4
ajouté
Woops, oui, la vieille école s'infiltre à travers. Oui, cmd.exe.
ajouté l'auteur Ogre Psalm33, source

Avez-vous essayé de les empiler?

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
ajouté
Nous avons essayé quelques variantes de ceci, en vain. CMD semble substituer tous ces% ALT_A%, etc. à la volée et le chemin final finit par être trop long pour être manipulé, ce qui me donne la même erreur.
ajouté l'auteur Ogre Psalm33, source

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;

Cela pourrait faire plus en fonction de votre classpath actuel.

1
ajouté
Junction est un frontal pour cela dans NTFS. mklink/D est un autre, peut-être déjà présent dans les versions ultérieures de Windows.
ajouté l'auteur mgaert, source
mlink ne semble pas être inclus sur Windows 7. junction est inclus dans le cadre de Windows 7 (entreprise).
ajouté l'auteur anjanb, source

Comme HuibertGill le mentionne, j'envelopperais ceci dans un script de construction Ant juste pour que vous n'ayez pas à gérer tout cela vous-même.

0
ajouté

Je pense que vous êtes dans la crique sans une pagaie ici. La ligne de commande a une limite pour les arguments pour appeler un programme.

J'ai 2 suggéré que vous pourriez essayer. Tout d'abord, avant d'exécuter les tests junit, vous pouvez laisser un script/ant_task créer des fichiers JAR des différentes classes sur le chemin de classe. Ensuite, vous pouvez mettre les fichiers JAR sur le classpath, ce qui devrait être plus court.

Une autre façon de tenter est de créer un script pour exécuter JUNIT, dans ANT il ne devrait pas y avoir une telle limite pour les entrées classpath.

0
ajouté

Tu pourrais essayer ça


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

aller à une invite de commande et exécutez-le deux fois (aucune idée pourquoi .... je dois le faire sur une machine Windows XP) également les chemins r définis uniquement pour la session d'invite de commande en cours

0
ajouté

Il n'y avait pas de solution au problème autrement qu'en raccourcissant le chemin de classe en déplaçant les fichiers jar dans un dossier comme "C: \ jars".

0
ajouté
Incorrect. Il y avait une autre solution, mais vous ne saviez pas ce que c'était, ou vous avez décidé de ne pas l'utiliser. Cependant, ce que vous avez fait était définitivement une solution ... qui peut fonctionner dans certaines circonstances.
ajouté l'auteur Stephen C, source