Como acessar Java JARs através da variável de ambiente CLASSPATH no Windows 7

0

Sei que existe this artigo sobre arquivos JAR no Linux, mas a solução envolve alguns comandos específicos do Linux que eu não conheço e, por fim, gostaria de entender se posso acessar meu JAR (e JARs depende disso) sem precisar escrever um script.

Estou no Windows 7 e minha classe Java principal é org.sync.MainEntry localizada no meu JAR principal chamado synchronizer.jar . Eu coloquei o caminho absoluto de todos os outros JARs dos quais ele depende na minha variável CLASSPATH em Computador - > Configurações avançadas - > Variáveis ambientais. Eu até tentei mover esses JARs para a mesma pasta que meu JAR principal.

Mas, quando eu executo (no prompt de comando, naveguei para o meu JAR principal, com ou sem outros JARs), a seguinte chamada:

java org.sync.MainEntry

Eu recebo um erro "Não é possível acessar o jarfile org.sync.MainEntry". Então eu movo TODOS os JARs para o mesmo lugar e tenho que fazer

java -cp my_other_jar.jar;my_other_other_jar.jar;synchronizer.jar org.sync.MainEntry

e isso finalmente funciona. Ou eu posso substituir todos os frascos com apenas *. Mas, eu preciso mover todos os JARs para o mesmo lugar ou colocar caminhos completos, e eu sinto que tem que haver uma maneira de se fazer isso sem criar um script de shell ou escrever os caminhos JAR completos a cada vez.

Com base no artigo mencionado acima, fico feliz em aceitar que CLASSPATH não vê jars, apenas as classes internas, mas um JAR é um arquivo, talvez eu possa extraí-los de alguma forma e apontar o CLASSPATH para ai?

Agradecemos antecipadamente por sua ajuda!

    
por kilgoretrout 06.08.2014 / 02:02

1 resposta

0

Arquivos JAR são bibliotecas de aplicativos. Você pode compará-los com DLLs. No entanto, uma DLL é sempre apenas uma biblioteca de código que um executável usaria. Um JAR pode conter apenas o código da biblioteca, mas também pode conter o próprio aplicativo. Outra diferença é que o Windows pode centralizar / registrar as DLLs para que elas possam ser descobertas. Nenhum conceito desse tipo existe para os JARs. Eles são realmente apenas artefatos que pertencem a um aplicativo Java específico. Eles podem ser compartilhados em tempo de execução, mas é raro de se ver. Um aplicativo Java normalmente fornecerá com ele todos os JARs necessários para executá-lo e nunca dependerá de nenhum JAR já existente no sistema de destino (exceto aqueles que fazem parte do próprio Java). As pessoas de Java tendem a não se importar com essa duplicação entre os aplicativos porque os JARs são geralmente de tamanho pequeno.

Um JAR é realmente apenas um arquivo ZIP de .class arquivos que o Java Virtual Machine usa. Dentro do ZIP há sempre um chamado arquivo MANIFEST e isso é apenas a única coisa que o torna diferente de um ZIP tradicional. (quando é realmente apenas um ZIP porque diabos você não pode navegar pelo Windows? Você precisa perguntar à Microsoft sobre isso. Use uma ferramenta adequada para lidar com arquivos compactados, eu recomendo 7Zip, ao invés de confiar em ferramentas do próprio Windows)

Para que qualquer aplicativo Java seja iniciado, ele precisa saber onde encontrar esses arquivos .class . Esses arquivos podem existir individualmente no disco ou podem ser empacotados em um arquivo JAR. O resultado é o mesmo. Não faz sentido extrair os arquivos .class do JAR.

Um aplicativo Java normalmente vem com um script de inicialização para que o 'cliente' não tenha que escrever seu próprio arquivo .BAT (ou qualquer outro) apenas para iniciar o aplicativo. No caso de não existir tal script, você terá que fazê-lo por conta própria.

    
por 17.08.2014 / 12:30