2008-10-14 12 views
32

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. He intentado varias variaciones, tales como:.¿Cómo establecer un largo classpath de Java en Windows?

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 están estableciendo la ruta de clase en una sola línea, el establecimiento de la ruta de clase a través de -classpath como argumento para Java ") Siempre se reduce a la consola vomitando que de la mano con este error:

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

se trata de una prueba unitaria de comprobar un proyecto bastante grande legado existente, así que no hay sugerencias sobre la reordenación de mi estructura de directorios a algo más razonable, ese tipo de soluciones son por ahora. 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. lp!

Respuesta

47

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 acceso en disco de su larga lista de jarras, etc. Ahora solo agregue este jar de canal a su línea de comando classpath. Esto suele ser más conveniente que empaquetar los recursos reales juntos.

Como recuerdo, las rutas de discos pueden ser relativas al contenedor . Por lo que el Manifest.mf podría ser algo como esto:

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

Si su tarro de encauzamiento contiene principalmente los recursos fundamentales, entonces no va a cambiar con demasiada frecuencia, pero es probable que todavía desee generar en algún lugar de su construcción.Por ejemplo:

<jar destfile="pathing.jar"> 
    <manifest> 
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/> 
    </manifest> 
</jar> 
+2

La tarea ManifestClassPath disponible en Ant desde la versión 1.7 se puede usar para generar una propiedad adecuada para el atributo Class-Path de una ruta Ant. –

+1

¿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? – bacar

+0

Intenté esto, pero el Manifest.mf ** permite solo URL relativas ** a otros JAR y directorios. – xamde

-2

¿Ha intentado apilarlas?

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

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. –

0

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 distintas clases en classpath. Luego puede colocar los JAR en la ruta de clases, que debería ser más corta.

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

4

(supongo que en realidad no quiere decir DOS, sino que se refieren a cmd.exe.)

Creo que es menos de una limitación de un entorno CLASSPATH/límite de tamaño variable de tamaño medio ambiente. 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 se sugirió Nick Berardi.

+0

Woops, sí, la vieja escuela se está filtrando. Sí, cmd.exe. –

17

Desde Java 6 puede usar classpath wildcards.

Ejemplo: foo/*, se refiere a todos los archivos .jar en el directorio foo

  • esto no va a coincidir con los archivos de clase (sólo archivos JAR). Para hacer coincidir ambos usos: foo;foo/* o foo/*;foo. El orden determina qué se carga primero.
  • la búsqueda no es recursivo
+1

Esto parece ser nuevo en Java 6. –

+1

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. –

+0

Pero esto no proporciona un recorrido recursivo. –

0

Como se menciona HuibertGill, me gustaría terminar con esto en un script de construcción Ant sólo para que usted no tiene que manejar todo esto a ti mismo.

1

Si estuviera en sus zapatos, descargaría la utilidad de unión de MS: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx y luego mapearía su "C: \ ruta" para decir, "z: \" y "c: \ ruta2" para decir, "y: \". De esta forma, reducirá 4 caracteres por artículo en su 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; 

Ahora, la ruta de clases será:

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

Se podría hacer más dependiendo de su real classpath.

+0

Junction es un front-end para esto en NTFS. 'mklink/D' es otro, puede que ya esté presente en versiones posteriores de Windows. – mgaert

+0

mlink no parece estar incluido en windows 7. junction se incluye como parte de windows 7 (enterprise). – anjanb

0

Usted podría intentar 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 ejecutar dos veces (ni idea de por qué .... tengo que hacerlo en una máquina Windows XP) también los caminos r configurado solo para la sesión del símbolo del sistema actual

0

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

+2

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. –

Cuestiones relacionadas