Java: classpath com caracteres curinga (wildcards)

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.

This entry was posted in Java. Bookmark the permalink.

One Response to Java: classpath com caracteres curinga (wildcards)

  1. Eduardo says:

    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

Leave a Reply

Your email address will not be published. Required fields are marked *