O que exatamente um arquivo jar contém?

88

Como estagiário, uso código da empresa em meus projetos e costumam me enviar um jararquivo para trabalhar. Eu adicioná-lo à construção pathem Eclipsee geralmente tudo é fino e elegante.

No entanto, fiquei curioso para saber o que cada classe continha e quando tento abrir uma das classes do jararquivo, me diz que preciso de um arquivo fonte.

O que isto significa? Eu venho de um plano de fundo C / C ++, então é jarsemelhante a um .oarquivo já compilado e tudo o que posso ver é o .hmaterial? Ou existe um código real no jararquivo que estou usando que está criptografado e não posso lê-lo?

Obrigado por todas as respostas!

Edit:
Obrigado, pessoal, eu sabia que era uma espécie de arquivo, mas fiquei confuso com o porquê, quando tentei abrir os .classarquivos, recebi um monte de caracteres aleatórios. A saída foi semelhante quando tentei abrir um .oarquivo em C, então só queria ter certeza.
Obrigado!

Joshualan
fonte
5
@Blue Moon: O engraçado é que o google me traz aqui. : p
user1036719
@ user1036719 Embora seja bom que você tenha encontrado a resposta aqui, ainda há um outro link que vem antes deste. E essa não é realmente uma questão de programação que precisa ser encorajada no SO. Eu não votei negativamente ou fechei o voto.
PP de

Respostas:

88

Um arquivo JAR é, na verdade, apenas um arquivo ZIP. Ele pode conter qualquer coisa - geralmente contém código Java compilado (* .class), mas às vezes também código fonte Java (* .java).

No entanto, Java pode ser descompilado - caso o desenvolvedor tenha ofuscado seu código, você não obterá nenhum nome de classe / função / variável útil.

ThiefMaster
fonte
53

No entanto, fiquei curioso para saber o que cada classe continha e quando tento abrir uma das classes no arquivo jar, isso me diz que preciso de um arquivo fonte.

Um arquivo jar é basicamente um arquivo zip contendo arquivos .class e potencialmente outros recursos (e metadados sobre o próprio jar). É difícil comparar C com Java realmente, já que o código de bytes Java mantém muito mais metadados do que a maioria dos formatos binários - mas o arquivo de classe é código compilado em vez de código-fonte.

Se você abrir o arquivo jar com um utilitário zip ou executá- jar xf foo.jarlo, poderá extrair os arquivos dele e dar uma olhada neles. Observe que você não precisa de um arquivo jar para executar o código Java - carregadores de classe podem carregar dados de classe diretamente do sistema de arquivos ou de URLs, bem como de arquivos jar.

Jon Skeet
fonte
Obrigado, eu sabia que era como um arquivo, já que poderia descompactá-lo, mas estava confuso por que nenhum dos arquivos .class continha texto legível. Obrigado por explicar, acho que um .class é como um arquivo .o.
joshualan
19

A melhor maneira de entender o que o arquivo jar contém é executando o seguinte:

Vá para a linha de comando e execute jar tvf jarfilename.jar

Ajay george
fonte
13

Um jararquivo é um arquivo zip com alguns arquivos adicionais que contêm metadados. (Apesar da extensão .jar, está no formato zip e quaisquer utilitários que lidem com arquivos .zip também podem lidar com arquivos .jar.)

http://docs.oracle.com/javase/8/docs/technotes/guides/jar/index.html

Os arquivos Jar podem conter qualquer tipo de arquivo, mas geralmente contêm arquivos de classe e arquivos de configuração de suporte (propriedades), gráficos e outros arquivos de dados necessários ao aplicativo.

Os arquivos de classe contêm código Java compilado, que é executável pela Java Virtual Machine.

http://en.wikipedia.org/wiki/Java_class_file

theglauber
fonte
1
mais 1 porque você vincula ao padrão
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10

JAR significa Java ARchive. É um formato de arquivo baseado no popular formato de arquivo ZIP e é usado para agregar muitos arquivos em um. Embora JAR possa ser usado como uma ferramenta de arquivamento geral, a principal motivação para seu desenvolvimento foi que os miniaplicativos Java e seus componentes necessários (arquivos .class, imagens e sons) pudessem ser baixados para um navegador em uma única transação HTTP, em vez de abrir uma nova conexão para cada peça. Isso melhora muito a velocidade com que um miniaplicativo pode ser carregado em uma página da web e começar a funcionar. O formato JAR também suporta compactação, o que reduz o tamanho do arquivo e melhora ainda mais o tempo de download. Além disso, entradas individuais em um arquivo JAR podem ser assinadas digitalmente pelo autor do miniaplicativo para autenticar sua origem.

oxy_js
fonte
5

O arquivo Jar contém classes binárias Java compiladas na forma das *.classquais podem ser convertidas em .javaclasses legíveis , descompilando-as usando algum descompilador de software livre. O jar também tem um opcional META-INF/MANIFEST.MFque nos diz como usar o arquivo jar - especifica outros arquivos jar para carregar com o jar.

Piyush Mattoo
fonte
3

Jar (Java Archive) contém um grupo de arquivos .class.

1. Para criar o arquivo Jar (arquivo Zip)

 if one .class (say, Demo.class) then use command jar -cvf NameOfJarFile.jar Demo.class (usually it’s not feasible for only one .class file)

 if more than one .class (say, Demo.class , DemoOne.class) then use command jar -cvf NameOfJarFile.jar Demo.class DemoOne.class

 if all .class is to be group (say, Demo.class , DemoOne.class etc) then use command jar -cvf NameOfJarFile.jar *.class

2. Para extrair o arquivo Jar (arquivo descompactado)

    jar -xvf NameOfJarFile.jar

3. Para exibir índice

    jar -tvf NameOfJarFile.jar
Bishwas Pokharel
fonte
2

Um arquivo .jar é semelhante a um arquivo .exe. Em essência, ambos são arquivos zip executáveis ​​(algoritmos zip diferentes).

Em um arquivo jar, você verá pastas e arquivos de classe. Cada arquivo de classe é semelhante ao seu arquivo .o e é um arquivo java compilado.

Se você quiser ver o código em um arquivo jar, baixe um descompilador java (localizado aqui: http://java.decompiler.free.fr/?q=jdgui ) e um extrator .jar (7zip funciona bem).

Tyzoid
fonte
1

JD-GUI é uma ferramenta muito útil para navegar e descompilar JARs

Anton Arhipov
fonte
1
Isso não responde à pergunta.
Craig Fisher
1

Um arquivo .jar contém código compilado (arquivos * .class) e outros dados / recursos relacionados a esse código. Ele permite que você agrupe vários arquivos em um único arquivo. Ele também contém metadados. Por ser um arquivo zip, é capaz de compactar os dados que você colocou nele.

Algumas coisas que achei úteis.

http://www.skylit.com/javamethods/faqs/createjar.html

http://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html

O livro OSGi na prática define arquivos JAR como, "JARs são arquivos compactados baseados no formato de arquivo ZIP, permitindo que muitos arquivos sejam agregados em um único arquivo. Normalmente, os arquivos contidos no arquivo são uma mistura de arquivos de classe Java compilados e recursos arquivos como imagens e documentos. Além disso, a especificação define um local padrão dentro de um arquivo JAR para metadados - a pasta META-INF - e vários nomes e formatos de arquivo padrão diretamente, o mais importante deles é o arquivo MANIFEST.MF. "

Wazza
fonte
1

Basta verificar se o aopalliance.jararquivo contém .javaarquivos em vez de .classarquivos. em caso afirmativo, apenas extraia o arquivo jar, importe-o no eclipse e crie um jar através do eclipse. Funcionou para mim

Ghanshyam
fonte
1

Enquanto aprendia sobre o JAR, me deparei com este tópico, mas não consegui obter informações suficientes para pessoas como eu, que têm background .NET, então vou adicionar alguns pontos que podem ajudar pessoas como eu com background .NET.

Primeiro, precisamos definir um conceito semelhante ao JAR no .NET, que é Assembly e assembly compartilha muito em comum com os arquivos JAR Java.

Portanto, um assembly é a unidade fundamental de empacotamento de código no ambiente .NET. Os assemblies são autocontidos e normalmente contêm o código intermediário das classes de compilação, metadados sobre as classes e quaisquer outros arquivos necessários para o código empacotado executar sua tarefa. Como os assemblies são a unidade fundamental do empacotamento do código, várias ações relacionadas à interação com os tipos devem ser feitas no nível do assembly. Por exemplo , a concessão de permissões de segurança, implantação de código e controle de versão são feitas no nível do assembly.

Os arquivos Java JAR executam uma tarefa semelhante em Java com a maioria das diferenças na implementação. Os assemblies geralmente são armazenados como EXEs ou DLLs, enquanto os arquivos JAR são armazenados no formato de arquivo ZIP .

Fonte de informação -> 5 - Assembléias

Muhammad Waqas Dilawar
fonte