¿Cómo establecer un largo classpath de Java en Windows?

Estoy tratando de ejecutar una prueba JUnit en particular a mano en una línea de comandos de Windows XP, que tiene un número inusualmente alto de elementos en la ruta de la clase. Probé varias variaciones, como por ejemplo:

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

(Otras variaciones son establecer el classpath todo en una línea, establecer el classpath a través de -classpath como un argumento para java "). Siempre se reduce a que la consola arroje sus manos con este error:

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

Esta es una prueba de JUnit que prueba un proyecto legacy existente bastante grande, por lo que no hay sugerencias sobre reorganizar mi estructura de directorios a algo más razonable, esos tipos de soluciones están fuera por el momento. Solo estaba tratando de generar una prueba rápida contra este proyecto y ejecutarlo en la línea de comandos, y la consola me está obstruyendo. ¡Ayuda!

34

9 Respuestas

La línea de comandos de Windows es muy limitante en este sentido. Una solución alternativa es crear un "contenedor de rutas". Este es un contenedor que contiene solo un archivo Manifest.mf , cuyo Class-Path especifica las rutas de disco de su larga lista de jar, etc. Ahora solo agregue este jar de ruta </​​em> a su classpath de línea de comando. Esto suele ser más conveniente que empaquetar los recursos reales juntos.

Según recuerdo, las rutas de disco pueden ser relativas al contenedor de rutas . Entonces, el Manifest.mf podría verse más o menos así:

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

Si su ruta jar contiene principalmente recursos fundamentales, entonces no cambiará con demasiada frecuencia, pero probablemente aún desee generarlo en algún lugar de su compilación. Por ejemplo:


  
    
  

49
agregado
¿Debo hacer algo, por ejemplo, asegurarme de que este frasco esté cargado? ¿O la JVM escaneará todos los frascos proporcionados en la ruta de clase para tales manifiestos? Además, ¿es portátil en las JVM? ¿Cuál es la versión mínima de Java que admite esto?
agregado el autor bacar, fuente
La tarea ManifestClassPath disponible en Ant desde la versión 1.7 se puede utilizar para generar una propiedad adecuada para el atributo Class-Path desde una ruta Ant.
agregado el autor Matt Hurne, fuente
Intenté esto, pero el Manifest.mf permite únicamente URL relativas a otros JAR y directorios.
agregado el autor xamde, fuente

Desde Java 6, puede utilizar classpath wildcards .

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

  • esto no coincidirá con los archivos de clase (solo archivos jar). Para hacer coincidir ambos, use: foo; foo/* o foo/*; foo . El orden determina qué se carga primero.
  • La búsqueda NO es recursiva
18
agregado
Esto parece una "Respuesta solo de enlace". Debería proporcionar más detalles sobre cómo hacerlo.
agregado el autor rghome, fuente
Oye, eso es genial, no sabía de eso. Esa es definitivamente una opción útil, especialmente si (como en nuestro caso), el classpath está lleno de jar, muchos de los cuales están en el mismo directorio.
agregado el autor Ogre Psalm33, fuente
Esto parece ser nuevo en Java 6.
agregado el autor Chris Noe, fuente
Pero esto no proporciona atravesamiento recursivo.
agregado el autor Snehal Masne, fuente

(supongo que en realidad no se refiere a DOS, pero consulte cmd.exe.)

Creo que es menos una limitación CLASSPATH que un límite de tamaño variable de entorno/tamaño del entorno. En XP, las variables de entorno individuales pueden tener un tamaño de 8k, todo el entorno está limitado a 64k. No puedo ver que llegues a ese límite.

Hay un límite en Windows que restringe la longitud de una línea de comando, en WindowsNT + es 8k para cmd.exe. Un comando establecido está sujeto a esa restricción. ¿Puede ser que tenga más de 8k de directorios valiosos en su comando de configuración? Puede que no tenga suerte, incluso si los divide como Nick Berardi sugirió.

4
agregado
Vaya, sí, la vieja escuela se está filtrando. Sí, cmd.exe.
agregado el autor Ogre Psalm33, fuente

¿Has intentado apilarlos?

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
agregado
Intentamos un par de variaciones de esto, fue en vano. CMD parece sustituir todos esos% ALT_A%, etc. sobre la marcha y la ruta final termina siendo demasiado larga para que la maneje, dándome el mismo error.
agregado el autor Ogre Psalm33, fuente

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;

Podría hacer más dependiendo de la ruta de clases actual .

1
agregado
Junction es una interfaz para esto en NTFS. mklink/D es otro, ya puede estar presente en versiones posteriores de Windows.
agregado el autor mgaert, fuente
mlink no parece estar incluido en windows 7. junction se incluye como parte de windows 7 (enterprise).
agregado el autor anjanb, fuente

Como menciona HuibertGill, incluiría esto en un script de compilación Ant para que no tenga que administrar todo esto usted mismo.

0
agregado

Creo que estás en el arroyo sin una paleta aquí. La línea de comandos tiene un límite para que los argumentos invoquen un programa.

Tengo 2 sugerencias que podrías intentar. En primer lugar, antes de ejecutar las pruebas junit, puede dejar que un script/ant_task cree JAR de las diversas clases en classpath. Luego puede colocar los JAR en classpath, que debería ser más corto.

Otra forma de probar es crear un antscript para ejecutar JUNIT, en ANT no debería haber tal límite para las entradas de classpath.

0
agregado

Podrías probar esto


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

ir a un símbolo del sistema y ejecutarlo dos veces (no tengo idea por qué ... tengo que hacerlo en una máquina con Windows XP) también las rutas r configuradas solo para la sesión actual del símbolo del sistema

0
agregado

No hubo otra solución al problema que no sea hacer de alguna manera el classpath más corto moviendo los archivos jar a una carpeta como "C: \ jar".

0
agregado
Incorrecto. Había otra solución, pero o no sabías lo que era o decidiste no usarla. Sin embargo, lo que hiciste fue definitivamente una solución ... que puede funcionar en algunas circunstancias.
agregado el autor Stephen C, fuente