Palavras-chave: classpath, wildcards, caractere curinga, Java 6
O Java 6 trouxe um recurso para facilitar a vida do programador: os caracteres curinga (wildcards) na definição do classpath. O que antes você fazia assim:
java -cp lib/codare-main.jar:lib/codare-utils.jar:lib/mail.jar \\ codare.MinhaClasse
Hoje pode fazer assim:
java -cp lib/\\* codare.MinhaClasse
Isso incluirá todos os arquivos *.jar dentro do diretório lib. Note bem: apenas os jars. Se você precisar de arquivos .class em diretórios, terá que incluí-los no classpath pela maneira tradicional:
java -cp lib/\\*:classes codare.MinhaClasse
Note também:
- A barra invertida (\) é apenas um caractere de escape para que o shell não faça a expansão do asterisco (*).
- A ordem dos arquivos .jar no classpath não é garantida.
- Este recurso, apesar de suportado pelo JDK 6 da Sun, não faz parte da especificação da JVM, portanto, você pode não encontrá-lo em outras implementações.
- Os curingas são expandidos na inicialização da VM. Assim, não adianta colocar novos arquivos .jar seguindo o padrão sem reiniciar a VM.
Porém, atenção: na versão atual, os caracteres curingas da JVM não são tão espertos como os do shell. A chamada a seguir, por exemplo, não funcionaria:
$ java -cp lib/\\*.jar codare.MinhaClasse Exception in thread "main" java.lang.NoClassDefFoundError: codare.MinhaClasse
Último detalhe: estes exemplos consideram um shell tipo UNIX. Em ambientes Windows, confesso, não consegui achar um comportamento previsível.
Descobri como fazer no Windows, o classpath deve estar entre aspas para evitar que o ‘*’ seja resolvido pelo shell?! do Windows.
Infelizmente ele não resolve recursivamente.
Exemplo:
java -Xms256M -Xmx256M -cp “../lib/*;../lib/aspects/*;../lib/http/*;../resources” -javaagent:../lib/aspects/spring-agent.jar