JAR no CLASSPATH

Pessoal alguém conhece alguma ferramenta que pege todos os jars de uma pasta e os adicione ao CLASSPATH ? Por que será que ainda tem que adicionar os arquivos, por que num pode indicar a pasta? :?

É que estou instalando o JDOM e pô, tem um monte de jars pra colocar (sim, quero colocar todos, sei que tem alguns que não precisa a partir do Java 1.4)… Tem alguma ferramenta? Num procurei no google ainda, será que o que estou querendo é absurdo? sei lá… Vou ter que fazer uma? :frowning:

Não sei se existe ferramenta, mas acabei de escrever esse comando e talvez te ajude.

É só abrir um prompt de comando na pasta dos seus arquivos jar e digitar este for, no exemplo abaixo, a pasta seria C:\Projeto

O comando vai gerar um jars.bat que ao ser executado adicionará todos os jars do diretório no classpath.

for %x in (*.jar) do echo set classpath=%classpath%;%cd%%x >> jars.bat

Exemplo:
C:\Projeto>for %x in (*.jar) do echo set classpath=%classpath%;%cd%%x >> jars.bat

Interessante Ramos. Mas é melhor a variável ser alterada definitivamente, no registro do windows e não apenas no shell atual. Mas mesmo assim é muito legal tua idéia. Tava pensando em adaptá-la assim:

Criar um script que adiciona à CLASSPATH todos os jars de de uma pasta (ex: a minha pasta “lib” onde pretendo colocar a maioria dos jars que eu precisar no classpath). Assim toda vez que eu rodar uma aplicação que precise dos jars, é só eu chamar antes esse script.

Só que era melhor alterar no registro do Windows mesmo e recarregar a CLASSPATH (essa segunda parte é mais difícil). Bom na verdade o melhor é que os jars de uma pasta fossem automaticamente incluídos, mas…

Acho que vou criar um gerenciadorzinho de variáveis de ambiente, que as exibe numa lista (o Windows não faz isso) que permite uma melhor visualização, e também, a adição dos jars na classpath desse modo prático que estamos falando.

Realmente, se a aplicação gravasse definitivamente na variável do Windows seria muito bom.

Eu acho que não temos uma ferramenta desse tipo famosa porque a maioria das pessoas usa alguma IDE pra fazer aplicações mais complexas e nas IDES você geralmente tem esse conceito de “grupos de jars”.

Mas se você desenvolver o programa mesmo, compartilhe porque deve ser útil pra mais gente.

Nao compartilhe não … com isso o GUJ vai ter muito mais gente perguntando porque dos erros bizarros que acontecem quando vc não controla adequadamente o classpath, situação conhecida como Jar Hell (sim, acontece igual ao DLL Hell). :wink:

Sério, isso parece interessante mas não é porque confunde demais e dificulta o controle sobre versões e tudo mais … claro, se vc só usar uma aplicação nao tera esse problema, mas tb nao tera porque se preocupar tanto com o classpath :roll:

Aliás isso que tava pensando: Se eu tenho duas versões do JDOM, 1.0 e 30.0, e tenho aplicações que usam umas a primeira e outras a segunda versão, mas as classes são as mesmas. Isso seria um conflito né? A solução seria mesmo ao rodar a aplicação, configurar um CLASSPATH pessoal né? Não sei não, mas acho que resolveram esse dll hell no .NET, o Java podia ter algum tipo de controle de versão de JARs também…

Sobre o programa, aí cabe a cada um decidir quando deve colocar ou quando não os jars no CLASSPATH, considerando o conflito de versões que o smota citou. Puxa mas eu tenho quatrocentos JARs para colocar no CLASSPATH só pra fazer o JDOM funcionar… uma aplicação ou bat que usasse pastas para incluir os jars ia me ajudar. E um programa que exibe coisas como PATH e CLASSPATH em forma de lista num é melhor do que você ver tudo sequencial separado por “;”? Bom acho que o Windows já era pra ter algo assim, mas como não tem…

Por enquanto vou fazer um script mesmo… tava pensando aqui Ramos e acho que até dá pra alterar o registro via script! Agora o grande problema é restartar <?>alguma coisa que recarregue as variáveis do registro…

Enfim, o script vai me ajudar legal por enquanto, e uma aplicação que exibe o PATH e CLASSPATH em forma de lista e adiciona conjuntos de JARs (bom uso dessa segunda opção é outra história) ia ou vai ser legal, pelo menos for me.

Ahhh que porcaria de BAT irritante num to consegundo fazer. Ramos!!!

Realmente, o problema do jar hell pode atrapalhar bastante.

Sobre o script, qual está sendo o problema no bat, Renato?

Putz cara, um monte de problemas. Sabe o que é pior? Depois de ter conseguido terminar o troço, que gera um .reg com os jars pra colocar no CLASSPATH, o reg simplesmente não funciona! Tentei várias coisas mas não descobri porque não funciona! Pelo menos uma lista de jars é gerada, daí já ajuda… ou pelo menos dá pra adicionar uma lista de jars no CLASSPATH do shell atual…

Taí os scripts… talvez seja necessária alguma adaptação…

#cpjar.bat - coloca os jars de uma pasta especificada no CLASSPATH do shell atual

@echo off

rem JARs in CLASSPATH 
rem Versão: 12/07/2005

rem Pasta dos JARs
    set jarFolder=%1

rem Script que adiciona explicitamente cada JAR ao CLASSPATH, será gerado
    set eachJarConfigurator=".\eachJarConfigurator.bat"

rem Classe que gera um .reg com a CLASSPATH a ser executado para configurá-la
    set classpathRegister="%bat%\cp2reg.bat"

rem Gera o configurador da CLASSPATH
    echo @echo off > %eachJarConfigurator%
    for %%x in (%jarFolder%\*.jar) do if not "%%x"=="" echo set CLASSPATH=%%CLASSPATH%%;%%x>> %eachJarConfigurator%

rem Chama o configurador da CLASSPATH e o gerador do .reg depois caso especificado
    call %eachJarConfigurator%
    if "%2"=="reg" call %classpathRegister%
    del /Q %eachJarConfigurator%

#cp2reg.bat - gera o reg com o CLASSPATH do shell atual

@echo off

rem Versão: 12/07/2005

set regFile=".\classpathConfig.reg"

echo Windows Registry Editor Version 5.00> %regFile%
echo. >> %regFile%
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]>> %regFile%
echo "CLASSPATH"="%CLASSPATH%">> %regFile%

rem regedit /s %regFile%
rem delete /Y %regFile%

Curiosidade: quando vocês precisam instalar o JDOM, por exemplo, que tem 4kg de jars pra colocar no CLASSPATH, como vocês fazem? :smiley:

Teste msg!

Hein? kkk…