Comment définir un long chemin de classe Java dans Windows?
Je suis en train de lancer un particulier JUnit test à la main sur un Windows XP en ligne de commande, ce qui a un nombre anormalement élevé d'éléments dans le chemin de 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 de la définition de la variable classpath sur une seule ligne, la définition de la classpath via-classpath comme un argument de java"). Il vient toujours vers le bas de la console de vomir mains avec cette erreur:
The input line is too long.
The syntax of the command is incorrect.
C'est un test JUnit test d'un assez vaste projet de l'héritage, 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 l'instant. J'essayais juste de gen en place d'un test rapide à l'encontre de ce projet et l'exécuter sur la ligne de commande, et la console est l'obstruction de moi. À l'aide!
Vous devez vous connecter pour publier un commentaire.
La ligne de commande de Windows est très restrictif à cet égard. Une solution de contournement consiste à créer un "cheminement de pot". C'est un bocal contenant seulement un
Manifest.mf
fichier, dont leClass-Path
spécifie le disque chemins de votre longue liste de pots, etc. Maintenant, il suffit d'ajouter ce cheminement pot à votre ligne de commande classpath. C'est généralement plus pratique que de les emballer les ressources réelles ensemble.Que je m'en souvienne, le disque chemins peuvent être par rapport à la cheminement pot lui-même. Ainsi, le
Manifest.mf
pourrait ressembler à quelque chose comme ceci:Si votre cheminement pot contient principalement des fondamentaux de ressources, alors il ne change pas trop souvent, mais vous aurez probablement encore envie de générer quelque part dans votre construction. Par exemple:
Depuis Java 6, vous pouvez utiliser classpath des caractères génériques.
Exemple:
foo/*
, fait référence à tous .les fichiers jar dans le répertoirefoo
foo;foo/*
oufoo/*;foo
. L'ordre détermine ce qui est chargé en premier.Utiliser Un Argument de "Fichier" sur l'île de Java 9+
En Java 9+, l'exécutable java prend en charge de fournir des arguments par l'intermédiaire d'un fichier. Voir
https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111.
Ce mécanisme est explicitement destiné à résoudre le problème de l'OS limitations sur commande longueurs:
C'est la "bonne" solution, si vous exécutez la version 9 ou plus. Ce mécanisme modifie simplement la façon dont l'argument est fourni à la JVM, et est donc 100% compatible avec n'importe quel cadre ou à l'application, indépendamment de la façon dont ils le font classloading c'est à dire qu'il est complètement équivalente à fournir simplement l'argument sur la ligne de commande comme d'habitude. Ce n'est pas vrai pour manifester à base de solutions de contournement pour ce système d'exploitation limitation.
Un exemple de ceci est:
De la commande d'origine:
java -cp c:\foo\bar.jar;c:\foo\baz.jar
peut être réécrite comme:
java @c:\path\to\cparg
où
c:\path\to\cparg
est un fichier qui contient:Cet argument de "fichier" permet également l'insertion de caractères de continuité et de cotation de la bonne utilisation des espaces dans les chemins par exemple
Gradle
Si vous rencontrez ce problème dans Gradle, voir ce plugin, qui convertit votre chemin de classe automatiquement dans un argument de "fichier" et prévoit que la JVM lors exec ou test de tâches de Windows. Sur Linux ou d'autres systèmes d'exploitation, il ne fait rien par défaut, si une option de valeur de configuration peut être utilisé pour appliquer la transformation, indépendamment de l'OS.
https://github.com/redocksoft/classpath-to-file-gradle-plugin
(disclaimer: je suis l'auteur)
Voir aussi cette Gradle question-et nous espérons que cette fonctionnalité sera finalement intégrée dans Gradle de base: https://github.com/gradle/gradle/issues/1989.
(Je suppose que vous n'avez pas vraiment dire, de DOS, mais se réfèrent à cmd.exe.)
Je pense qu'il est moins celui de la limitation que dans un environnement de taille/variable d'environnement limite de taille. Sur XP, individuelles variables d'environnement peuvent être 8k en taille, tout l'environnement est limitée à 64 ko. Je ne peux pas vous voir frapper à cette limite.
Il y a une limite sur windows qui limite la longueur d'une ligne de commande sur windows nt+ c'est 8k pour cmd.exe. Un ensemble de commande est soumis à cette restriction. Peut-il être que vous avez plus de 8k valeur de répertoires dans votre commande? Vous pouvez être hors de la chance, alors - même si vous les diviser comme Nick Berardi suggéré.
Si j'étais à votre place, je voudrais télécharger la jonction de l'utilitaire à partir de MS : http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx et puis la carte de votre
"C:\path" pour dire "z:\" \ " et "c:\path2" pour dire "y:\". De cette façon, vous serez en réduisant les 4 caractères par article dans votre
classpath
.Maintenant, votre chemin de classe seront les suivants :
Il pourrait faire plus en fonction de vos réels
classpath
.mklink /D
en est une autre, peut-être déjà présentes dans les versions ultérieures de Windows.Grâce à Raman pour l'introduction d'une nouvelle solution à un cheminement problème pour Java 9+. J'ai fait un hack pour
bootRun
tâche qui permet d'utiliser tout déjà évaluées par gradle pour exécuter java avec l'argument de fichiers. Pas très élégant mais de travail.Je pense que vous êtes jusqu'à la crique sans pagaie ici.
La ligne de commande a une limite d'arguments à l'appel d'un programme.
J'ai 2 sugestion vous pourriez essayer.
Tout d'abord, avant l'exécution des tests junit, vous pouvez laisser un script/ant_task créer des Pots de différentes classes sur le chemin de la classe.
Ensuite, vous pouvez placer les Pots sur le chemin de classe, qui devrait être plus court.
Une autre façon vous pourriez faire est d'essayer de créer un antscript pour exécuter JUNIT,
dans ANT il ne devrait pas être une limite pour classpath entrées.
Comme HuibertGill mentionne, je voudrais conclure en un script Ant juste de sorte que vous n'avez pas à gérer tout cela, vous-même.
Vous pouvez essayer ce
aller à une invite de commande et exécutez deux fois(aucune idée de pourquoi....je dois le faire sur une machine windows XP)
aussi les chemins r de la session d'invite de commande
Il n'y a pas de solution à la question difficile de faire le chemin plus court en déplaçant les fichiers jar dans un dossier comme "C:\jars".
Avez-vous essayé de les empiler?