Como converter AAR para JAR

92

Situação :

Pretendo usar uma biblioteca Java e só tenho um arquivo AAR de um repositório Maven, mas preciso do arquivo JAR .

História de fundo:

Tentei compilar uma biblioteca, mas sua estrutura Gradle era instável. Então, pedi um arquivo jar compilado e seu desenvolvedor me entregou um arquivo aar de algum repositório Maven (o desenvolvedor não conseguiu compilar seu próprio projeto). A configuração do Gradle era uma bagunça, dependia de várias bibliotecas e o Gradle lançou algumas exceções.

Tentei usá-lo em meu IDE do IDEA, mas não consegui ver. Um projeto de biblioteca deve ser capaz de ser compilado em um arquivo jar, certo?

Questão :

O que devo fazer para converter esse arquivo AAR em um arquivo JAR?

Nestor
fonte
1
Você pode simplesmente renomeá-lo de volta para .jar, mas sem saber mais detalhes sobre o seu ambiente, isso pode ou não ser o que você precisa fazer, um AAR é uma biblioteca Axis com usos específicos.
Pedantic
1
Você vai rir, mas eu tive que adicionar algumas palavras não regulares porque ASSIM não permitia que minha pergunta fosse postada por ser tão simples. E eu acho que diz tudo que o desenvolvedor da biblioteca não pode compilar seu próprio projeto usando Gradle ...
Nestor

Respostas:

141

O arquivo AAR consiste em um arquivo JAR e alguns arquivos de recursos (é basicamente um arquivo zip padrão com uma extensão de arquivo personalizada). Aqui estão as etapas para converter:

  1. Extraia o arquivo AAR usando a extração zip padrão (renomeie-o para * .zip para torná-lo mais fácil)
  2. Encontre o arquivo classes.jar nos arquivos extraídos
  3. Renomeie-o como quiser e use esse arquivo jar em seu projeto
Nestor
fonte
53
Interessante que esta resposta seja aceita, porque simplesmente renomear um jar e copiá-lo para o diretório libs do seu projeto não funcionará devido ao fato de que os arquivos de recursos estão faltando no jar.
ChuongPham
Seguindo o tutorial para Spotify Android SDK, esta resposta foi o remédio. Isso porque eu desenvolvo projetos no Netbeans, o que parece não estar em conformidade com a extensão AAR. A observação de ChuongPham parece estar relacionada não a esta resposta, mas à resposta de AWT, e então eu concordo parcialmente com ChuongPham, isto é, a simples renomeação de AAR para JAR não está funcionando. No entanto, também discordo parcialmente porque "recursos" não é relevante para o arquivo classes.jar.
carl
11
Tive dificuldade em descobrir como extraí-lo no mac, no caso de outros também: basta alterar .aar para .zip e clicar duas vezes!
Bastien Beurier
5
então qual é a solução para criar um jar baseado em recursos?
2cupsOfTech
2
Esta solução extrai apenas o arquivo jar, mas os recursos não contêm nele. Algo estaria errado.
Tinker Sun
21

.aar é um arquivo zip padrão, o mesmo usado em .jar. Apenas altere a extensão e, presumindo que não esteja corrompida nem nada, deve ficar bem.

Se necessário, você pode extraí-lo para seu sistema de arquivos e, em seguida, empacotá-lo novamente como um jar.

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)
AWT
fonte
Quando executo o jar xf, não recebo nada: C: \ Arquivos de programas \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Files \ Java \ jdk1.7.0_25 \ bin>
Nestor
1
cara, o passo 1 é o suficiente. Basta renomeá-lo para .jar. Na minha opinião, as etapas (2) e (3) são inúteis
Dr. Deo
@DrDeo Se eu apenas renomeá-lo, o projeto eclipse não o está reconhecendo como uma biblioteca. Isso é normal? Alguma pista?
Tanasis de
1
Se você apenas renomeá-lo e não reempacotá-lo com jar, ele não terá um manifesto e não o reconhecerá como um arquivo jar válido, acredito.
AWT
16

Como muitas outras pessoas observaram, apenas extrair o .jar do arquivo .aar não é suficiente, pois podem estar faltando recursos.

Aqui estão as etapas que funcionaram para mim (contexto do Android, sua milhagem pode variar se você tiver outras finalidades):

  1. Renomeie o arquivo .aar para .zip e extraia.
  2. A pasta extraída é um projeto ADT que você pode importar no Eclipse com algumas pequenas modificações (veja abaixo)!
  3. Na pasta extraída, renomeie o arquivo contido classes.jar para o que quiser (neste exemplo, myProjectLib.jar) e mova-o para a pasta lib dentro da pasta extraída.
  4. Agora, para que o Eclipse o aceite, você precisa colocar dois arquivos na raiz da pasta extraída:
    • .projeto
    • .classpath
  5. Para fazer isso, crie um novo projeto fictício Android no Eclipse e copie os arquivos ou copie de um projeto Android existente.
  6. Abra o arquivo .project e procure a tag de nome XML e substitua o conteúdo dela por myProjectLib (ou o que quer que você tenha chamado de arquivo jar acima) e salve.
  7. Agora, no Eclipse, você pode Arquivo -> Novo -> Projeto -> Projeto Android a partir de uma fonte existente ... e apontar para o conteúdo da pasta extraída.
  8. Após a importação, clique com o botão direito do mouse no projeto recém-criado, selecione Propriedades -> Android e marque É biblioteca .
  9. Em seu projeto principal para o qual você deseja usar a biblioteca, vá também em Propriedades -> Android e adicione o myProjectLib recém-adicionado à lista de dependências.
rsp1984
fonte
Isso me ajudou. Mas para que funcionasse totalmente, eu precisava criar uma pasta "src" vazia entre as etapas 6 e 7.
Bernhard Krenz
8

Para aqueles que desejam fazer isso automaticamente, escrevi um pequeno script bash de duas linhas que faz as duas coisas seguintes:

  1. Procura por todos os arquivos * .aar e extrai classes.jar deles
  2. Renomeia classes.jar extraídas para ficar como o aar, mas com uma nova extensão

    find . -name '*.aar' -exec sh -c 'unzip -d `dirname {}` {} classes.jar' \;
    find . -name '*.aar' -exec sh -c 'mv `dirname {}`/classes.jar `echo {} | sed s/aar/jar/g`' \;

É isso aí!

ddmytrenko
fonte
1
Claro, qualquer conversão de aar2jar não conterá recursos e manifesto dentro. Podemos dizer (não definitivamente, mas perto disso) aar=jar+res+manifest+libs. Deixe rest=res+manifest+libs, então jar(aar)=aar-rest.
ddmytrenko
É isso que eu realmente quero! Muito obrigado. Mas realmente aumenta o uso do disco. porque toda biblioteca de suporte tem muitas versões. apenas descompactar a versão mais recente pode ser melhor
iptton
6

O Android Studio (versão: 1.3.2) permite que você acesse perfeitamente o .jar dentro de um .aar.

Bônus: descompila automaticamente as classes!

Basta seguir estas etapas:

  1. File > New > New Module > Import .JAR/.AAR Package para importar você .aar como um módulo

  2. Adicione o módulo recém-criado como uma dependência ao seu projeto principal (não tenho certeza se necessário)

  3. Clique com o botão direito em "classes.jar" conforme mostrado na captura abaixo e clique em "Mostrar no explorer". Aqui está seu .jar.

acessar .jar de .aar

Sébastien
fonte
1
primeiro deve selecionar o projeto em vez de android no gerenciador de projeto, em seguida, as bibliotecas externas mostrarão
Samad
5
 The 'aar' bundle is the binary distribution of an Android Library Project. .aar file 
 consists a JAR file and some resource files. You can convert it
 as .jar file using this steps

1) Copy the .aar file in a separate folder and Rename the .aar file to .zip file using 
 any winrar or zip Extractor software.

2) Now you will get a .zip file. Right click on the .zip file and select "Extract files". 
 Will get a folder which contains "classes.jar, resource, manifest, R.java,
 proguard(optional), libs(optional), assets(optional)".

3) Rename the classes.jar file as yourjarfilename.jar and use this in your project.

Nota: Se você deseja obter apenas o arquivo .jar do seu arquivo .aar, use o método acima. Suponha que se você deseja incluir o manifest.xml e os recursos com seu arquivo .jar, significa que você pode apenas clicar com o botão direito no arquivo .aar e salvá-lo como arquivo .jar diretamente em vez de salvá-lo como .zip. Para visualizar o arquivo .jar que você extraiu, baixe JD-GUI (Java Decompiler) . Em seguida, arraste e solte seu arquivo .jar neste JD_GUI, você pode ver o arquivo .class em formatos legíveis como um arquivo .java.

insira a descrição da imagem aqui insira a descrição da imagem aqui

anand krish
fonte
Isso significa que podemos usar o arquivo AAR como um arquivo JAR apenas renomeando-o de .aar para .jar?
Soumya
@Soumya, não, não pode.
ddmytrenko
2
Na verdade, o assunto da conversa está errado. Não podemos converter AAR em JAR ou vice-versa. A única coisa que podemos fazer é "extrair o JAR do AAR". E eu escrevi como fazer isso automaticamente usando duas linhas de código Bash aqui: stackoverflow.com/a/29252592/746529
ddmytrenko
4

Projetos .aar baseados em recursos

Encontrar o arquivo classes.jar dentro do arquivo .aar é bastante trivial. No entanto, essa abordagem não funciona, se o projeto .aar definiu alguns recursos (exemplo: R.layout.xyz)

  • Portanto, deaar de CommonsGuy me ajudou a obter um projeto compatível com ADT válido de um arquivo .aar. No meu caso, converti subampling-scale-image-view . Levei cerca de uma hora para configurar o Ruby no meu PC.

  • Outra abordagem é usar o plugin android-maven para Eclipse / ADT como CommonsGuy escreve em seu blog .

  • Outra abordagem poderia ser, apenas clonar todo o projeto desejado como fonte do git e importá-lo como "Projeto Android existente"

Um mundo
fonte
1

Se você estiver usando o Gradle para suas compilações, há um plug-in do Gradle que permite adicionar a dependência aar aos seus módulos java | kotlin | scala | ....

https://github.com/stepango/aar2jar

plugins {
    id 'java'
    id 'com.stepango.aar2jar' version 0.6 // <- this one
}

dependencies {
    compileOnlyAar "com.android.support:support-annotations:28.0.0" // <- Use any AAR dependencies
}
Stepango
fonte
Tentando entender, é possível fazer 'compileOnlyAar' para o plugin android app / lib? Eu sei que não é sobre a sua biblioteca, mas talvez você saiba que é possível, pois o plugin do Android não contém configuração de artefato como 'compileOnlyAar'. Você pode entender por que preciso dessa funcionalidade aqui ( stackoverflow.com/questions/60998072/… )
HeyAlex