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?
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.
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?
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.