Dúvida quanto ao comando JAVA e JAVAC - Passando uma JAR

Boa tarde.

No livro que estou estudando vi sobre o comando javac e java, usados no cmd para compilar e executar os códigos.

O livro ainda cita, brevemente, o que um arquivo jar (é explicado que se trata de uma espécie de zip com suas classes e recursos).

E um determinado momento o livro mostra que é possível compilar e executar um código e ainda passar um jar para ser usado junto. O comando seria algo assim:

C:\root>javac -cp /path/to/library.jar Teste.java ou
C:\root>java -cp /path/to/library.jar Teste

Na prática, quando iremos usar isso? Achei estranho porque passamos todo um arquivo zip, cheio de outras coisas, como o compilador sabe o que usar do arquivo jar?

Obrigado!

1 - Comando javac (Java Compiler): compila os arquivos .java para .class.
2 - Comando java: basicamente chama a JVM para que ela leia os bytecodes e os compile (traduza) no momento oportuno (JIT - Just-In-Time) para a linguagem de máquina.
3 - A opção (-cp ou -classpath) permite identificar/acessar o caminho das classes (os pacotes/diretórios onde as classes estão.

Eu particularmente nunca vi ou usei o compilador para ‘compilar’ um JAR. No entanto, uso esse comando:

java -jar arquivo.jar,

para executar um JAR. Então, pelo menos para mim é mesmo muito estranho.

1 curtida

Mais um pouco sobre esse JAR…

Eu li que podemos ter de tudo dentro desse .jar… Incluindo classes, interfaces, recursos e etc. Quando você diz “executar um jar” o que realmente acontece? O que será executado?

Obrigado!

A JVM acessa os arquivos .class para ler o seu coteúdo, isto é, os bytecodes. As classes de bytecode (.class) estão dentro do JAR (que é uma pasta zipada). Com base nas informações presentes no arquivo de manifesto Manifest.mf que, entre outras coisas informa qual é a classe principal, carrega o que tem que ser carregado para que as classes funcionem como planejado (como elas foram codificadas), como um ícone ou uma biblioteca, por exemplo, e transforma em linguagem de máquina à medida em que se faça necessário (JIT: Just-In-Time). Quando em linguagem de máquina, de acordo com sistema operacional, o computador executa o código.

1 curtida

Obrigado!

Após perguntar eu fui pesquisar um pouco mais. E acabei descobrindo o arquivo manifest e como fazemos para dizer qual é a main class do jar.

Muito obrigado pela ajuda!