Como definir um longo caminho de classe Java no Windows?

Eu estou tentando executar um determinado teste JUnit manualmente em uma linha de comando do Windows XP, que tem um número excepcionalmente alto de elementos no caminho de classe. Eu tentei várias variações, como:

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

(Outras variações estão definindo o classpath todos em uma linha, definindo o classpath via -classpath como um argumento para java "). Ele sempre desce para o console vomitando suas mãos com este erro:

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

Este é um teste da JUnit testando um projeto legado bastante grande, então nenhuma sugestão sobre reorganizar minha estrutura de diretório para algo mais razoável, esses tipos de soluções estão fora por enquanto. Eu estava apenas tentando criar um teste rápido contra este projeto e executá-lo na linha de comando, e o console está me impedindo. Socorro!

34

9 Respostas

A linha de comando do Windows é muito limitadora a esse respeito. Uma solução alternativa é criar um "jarro de caminho". Este é um jar contendo apenas um arquivo Manifest.mf , cujo Class-Path especifica os caminhos de disco da sua longa lista de jars, etc. Agora apenas adicione isto pathing jar para o seu classpath da linha de comando. Isso geralmente é mais conveniente do que empacotar os recursos reais juntos.

Pelo que me lembro, os caminhos do disco podem ser relativos ao jar do caminho . Então o Manifest.mf pode ser algo como isto:

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

Se o seu jar do caminho contiver principalmente recursos fundamentais, ele não será alterado com muita frequência, mas provavelmente você ainda desejará gerá-lo em algum lugar da sua compilação. Por exemplo:


  
    
  

49
adicionado
Preciso fazer alguma coisa, por exemplo, garantir que este frasco esteja carregado? Ou a JVM examinará todos os jars fornecidos no caminho de classe para tais manifestos? Além disso, é portátil em JVMs? Qual é a versão mínima do Java que suporta isso?
adicionado o autor bacar, fonte
A tarefa ManifestClassPath disponível no Ant desde a versão 1.7 pode ser usada para gerar uma propriedade adequada para o atributo Class-Path de um Ant Path.
adicionado o autor Matt Hurne, fonte
Eu tentei isso, mas o Manifest.mf permite apenas URLs relativos para outros JARs e diretórios.
adicionado o autor xamde, fonte

Desde o Java 6, você pode usar curingas do caminho de aula .

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

  • isso não corresponderá aos arquivos de classe (somente arquivos jar). Para corresponder a ambos, use: foo; foo/* ou foo/*; foo . A ordem determina o que é carregado primeiro.
  • A pesquisa NÃO é recursiva
18
adicionado
Isso parece ser uma "Resposta somente de link". Você deve fornecer mais detalhes sobre como fazer isso.
adicionado o autor rghome, fonte
Ei, isso é legal - eu não sabia disso. Isso é definitivamente uma opção útil, especialmente se (como no nosso caso), o classpath está cheio de jars, muitos dos quais estão no mesmo diretório.
adicionado o autor Ogre Psalm33, fonte
Isso parece ser novo no Java 6.
adicionado o autor Chris Noe, fonte
Mas isso não fornece travessia recursiva.
adicionado o autor Snehal Masne, fonte

(suponho que você não significa realmente DOS, mas se refira ao cmd.exe.)

Eu acho que é menos uma limitação de CLASSPATH do que um limite de tamanho de tamanho de ambiente/variável de ambiente. No XP, variáveis ​​de ambiente individuais podem ter 8k de tamanho, todo o ambiente é limitado a 64k. Eu não posso ver que você iria atingir esse limite.

Há um limite nas janelas que restringe o comprimento de uma linha de comando, no WindowsNT + é 8k para o cmd.exe. Um comando set está sujeito a essa restrição. Pode ser que você tenha mais de 8k de diretórios no comando set? Você pode estar sem sorte, então - mesmo que você os divida como Nick Berardi sugerido.

4
adicionado
Ops, sim, a velha escola está se infiltrando. Sim, cmd.exe.
adicionado o autor Ogre Psalm33, fonte

Você já tentou empilhá-los?

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
adicionado
Tentamos algumas variações disso, sem sucesso. CMD parece substituir todos os% ALT_A%, etc on-the-fly e o caminho final acaba sendo muito longo para ele lidar, me dando o mesmo erro.
adicionado o autor Ogre Psalm33, fonte

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;

Pode fazer mais dependendo do seu caminho de classe atual.

1
adicionado
Junção é um front-end para isso em NTFS. mklink/D é outro, pode já estar presente em versões posteriores do Windows.
adicionado o autor mgaert, fonte
mlink não parece estar incluído no windows 7. junção é incluída como parte do windows 7 (enterprise).
adicionado o autor anjanb, fonte

Como HuibertGill menciona, eu colocaria isso em um script de construção Ant apenas para que você não tivesse que gerenciar tudo isso sozinho.

0
adicionado

Eu acho que você está no riacho sem uma pá aqui. A linha de comando tem um limite para argumentos para chamar um programa.

Eu tenho 2 sugestões que você pode tentar. Primeiro, antes de executar os testes junit, você pode permitir que um script/ant_task crie JARs das várias classes no caminho de classe. Então você pode colocar os JARs no classpath, que deve ser mais curto.

Outra maneira que você pode tentar é criar um antscript para executar o JUNIT, na ANT não deve haver um limite para entradas de caminho de classe.

0
adicionado

Você poderia tentar isso


@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 para um prompt de comando e executá-lo duas vezes (não tenho idéia porque .... eu tenho que fazer isso em uma máquina com Windows XP) também os caminhos r definidos apenas para a sessão de prompt de comando atual

0
adicionado

Não havia solução para o problema além de, de alguma forma, tornar o caminho de classe mais curto, movendo os arquivos jar para uma pasta como "C: \ jars".

0
adicionado
Incorreta. Havia outra solução, mas você não sabia o que era ou decidiu não usá-la. No entanto, o que você fez foi definitivamente uma solução ... que pode funcionar em algumas circunstâncias.
adicionado o autor Stephen C, fonte