Como fazer um .jar a partir de um projeto Android Studio

96

Estou usando o AndroidStudio e tenho este projeto conforme mostrado:

insira a descrição da imagem aqui

O que está dentro do círculo azul é myLib. myLib também precisa usar uma lib externa que está dentro do círculo vermelho e um pacote apache (círculo verde).

Então, quero fazer com que tudo isso se torne um único .jar, para que possa usá-lo em outros projetos.

Um guia passo a passo seria muito apreciado, sou um iniciante no mundo dos desenvolvedores.

Obrigado!

dum4ll3
fonte
1
Acho que o que você quer é um arquivo aar (arquivo Android) que possa ser vinculado de forma simples e tranquila como dependência. Basicamente, você precisa criar um projeto de biblioteca Android. Mas não posso escrever os passos exatos da mente.
rekire de
2
Preciso de um arquivo .jar para que possa usar em qualquer projeto java. Não só do Android.
dum4ll3 de
1
Deve ser quase o mesmo - faça um projeto de biblioteca e exporte-o.
Thrash Bean
Este bug descreve uma deficiência no plug-in gradle do Android que evita hackear facilmente o buildfile do gradle para adicionar um alvo jar ...
mmigdol

Respostas:

135
  • Abra build.gradle para projeto de biblioteca insira a descrição da imagem aqui

  • Escreva duas tarefas em build.gradle - deleteJar e createJar e adicione a regra createJar.dependsOn (deleteJar, build) insira a descrição da imagem aqui

O código acima:

task deleteJar(type: Delete) {
    delete 'libs/jars/logmanagementlib.jar'
}           

task createJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('libs/jars/')
    include('classes.jar')
    rename('classes.jar', 'logmanagementlib.jar')
}

createJar.dependsOn(deleteJar, build)
  • Expanda o painel gradle da direita e abra todas as tarefas em sua biblioteca-> outros. Você verá duas novas tarefas lá - createJar e deleteJar insira a descrição da imagem aqui

  • Clique duas vezes em createJar insira a descrição da imagem aqui

  • Assim que a tarefa for executada com sucesso, obtenha o jar gerado no caminho mencionado na tarefa createJar, ou seja, libs / xxxx.jar insira a descrição da imagem aqui

  • copie o jar recém-gerado para a pasta lib do seu projeto necessário -> clique com o botão direito -> selecione "adicionar como biblioteca"

Abhinav Tyagi
fonte
4
Às vezes, as pessoas entendem vendo em vez de ler. É uma boa UX, você vê ☺
Abhinav Tyagi
5
Bem, então devo dizer que não tenho certeza release. Eu tenho debuge default, mas nenhuma releasepasta. Qual versão do plugin você está usando? Você sabe se isso está documentado em algum lugar?
Cameron Lowell Palmer
3
Eu não tenho releasepasta.
Kamran Bigdely,
4
O que você está tentando copiar ?? Devemos direcionar as pastas que contêm o arquivo APK ?? Quero dizer na linha de ('build / intermediários / bundles / default') o que este diretório está reservando para você. Não há nenhuma pasta em meu android studio com o nome bundles, e continuo recebendo NENHUMA FONTE na tarefa
createJar
12
mude de ('build / intermediates / bundles / release /') para de ('build / intermediates / packaged-classes / release /') para Android Studio 3.1.3 e Gradle versão 4.4
Vaishakh
59

Se você configurar o código como um módulo Java simples no Gradle, será realmente fácil fazer com que o Gradle forneça um arquivo jar com o conteúdo. Esse arquivo jar terá apenas o seu código, não as outras bibliotecas Apache das quais depende. Eu recomendo distribuí-lo dessa forma; é um pouco estranho agrupar dependências dentro de sua biblioteca, e é mais normal que os usuários dessas bibliotecas tenham que incluir essas dependências por conta própria (porque caso contrário, há colisões desses projetos já estão vinculando cópias da biblioteca, talvez de versões diferentes ) Além do mais, você evita possíveis problemas de licenciamento em torno da redistribuição do código de outras pessoas se publicasse sua biblioteca.

Pegue o código que também precisa ser compilado em um jar e mova-o para um módulo Java simples separado no Android Studio:

  1. Menu Arquivo > Novo Módulo ... > Biblioteca Java
  2. Configure a biblioteca, o nome do pacote Java e os nomes das classes no assistente. (Se você não quiser criar uma classe para você, você pode simplesmente excluí-la assim que o módulo for criado)
  3. Em seu código Android, configure uma dependência no novo módulo para que ele possa usar o código em sua nova biblioteca:
  4. Arquivo > Estrutura do projeto > Módulos > (seu módulo Android) > Dependências > + > Dependência do módulo . Veja a imagem abaixo: insira a descrição da imagem aqui
  5. Escolha o seu módulo na lista da caixa de diálogo exibida: insira a descrição da imagem aqui

Esperançosamente, seu projeto deve estar sendo construído normalmente agora. Depois de fazer uma construção, um arquivo jar para sua biblioteca Java será colocado no diretório build / libs no diretório do seu módulo. Se você deseja construir o arquivo jar manualmente, pode executar sua tarefa de arquivo jar a partir da janela do Gradle: insira a descrição da imagem aqui

Scott Barta
fonte
Muito obrigado! Sua resposta foi muito útil, principalmente na última captura de tela que mostra as tarefas do Gradle. Eu não sabia disso. Eu poderia seguir seus passos, mas ainda estou sentindo falta do org.apache.http.Header. Como posso importá-lo para minha biblioteca?
dum4ll3
O que você quer dizer quando diz que está perdendo?
Scott Barta
1
Vá até o mesmo fluxo de Estrutura do projeto> dependências, mas escolha o módulo da biblioteca em vez do projeto e adicione a dependência da mesma maneira. Em minha resposta, digo que ele coloca o arquivo jar no diretório build / libs em seu diretório de módulo.
Scott Barta
1
Eu tenho: java.lang.NoClassDefFoundError: com.loopj.android.http.RequestParams. Essa é minha biblioteca externa que estou compilando com a minha.
dum4ll3
2
Funciona apenas com a biblioteca java e a tarefa jar na biblioteca Android não existe
cuasodayleo
26

No IDE do Android Studio, acesse a " barra Executar Anything ":

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

Depois disso, você encontrará seu artefato nesta pasta em seu projeto
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


OU


O Gradle já tem um Taskpara isso, no menu lateral do gradle, abaixo da otherpasta.

barra de ferramentas gradle

Em seguida, role para baixo createFullJarReleasee clique nele.

Tarefas Gradle

Depois disso, você encontrará seu artefato nesta pasta em seu projeto

Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar

Haroun Hajem
fonte
2
Não consigo ver esta opção. Isso foi adicionado em uma versão recente do Studio?
Dibzmania
1
Eu construo e quando encontro * .jar seu nome é: full.jar. 30 minutos para
fundá-
1
No meu caso, encontrei-o embuild\intermediates\intermediate-jars\release
Yusril Maulidan Raji
Eu tenho uma pergunta. No meu caso, ele gera 3 arquivos jar. classes.jar,, full.jare res.jar. Devo importar todos os arquivos jar sempre que quiser usá-los?
Yusril Maulidan Raji
Basta usar o full.jar
Haroun Hajem de
11

Basta adicioná-lo ao build.gradle do módulo java. Incluirá bibliotecas dependentes no arquivo.

mainClassName = "com.company.application.Main"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

Isso resultará no arquivo [module_name] / build / libs / [module_name] .jar.

Bao Le
fonte
Mas uma biblioteca .jar teria uma classe principal? O OP diz que está construindo um arquivo .jar "para que eu possa usar em outros projetos" (sic). Isso parece uma biblioteca.
Steve White
Só esse cara realmente entendeu isso, apenas a criação de jar não resolve problemas. e se precisarmos executá-lo. O código acima evita o erro "Não é possível executar o arquivo jar:“ nenhum atributo de manifesto principal ”"
MobileEvangelist
1

O arquivo .jar será gerado automaticamente quando você compilar / executar seu aplicativo.

Você pode encontrar seu arquivo class.jar em root_folder / app / build / intermediates / bundles / debug

localização do arquivo jar

Sonia John Kavery
fonte
1
  1. Acesse a guia Gradle no Android Studio e selecione o projeto de biblioteca.

  2. Em seguida, vá para Tarefas

  3. Em seguida, vá para outro

  4. Clique duas vezes em bundleReleaseaar

Você pode encontrar seus .aararquivos emyour_module/build/outputs/aar/your-release.aar

Aqui imagem

Damo Gurcinovski
fonte
Não vejo nenhuma "Guia Gradle" em lugar nenhum. Por fim, digitei "Gradle" na busca da Ajuda e obtive algo parecido com a visualização do Gradle. Mas a lista interna é muito diferente, muito mais curta que a sua. Não há bundleReleaar em Tarefas-> Outro. Existe um "createJar", mas quando clico nele, obtenho "Tarefa 'createJar' não encontrada no projeto raiz ..." Estou preso. E ... por que queremos arquivos .aar? O OP pediu um arquivo .jar. É a mesma coisa>
Steve White
Mas a questão é como .jarnão fazer.aar
Aleksey Timoshchenko
0

a maneira que encontrei foi encontrar a saída do compilador do projeto (estrutura do projeto> projeto). em seguida, encontre a pasta compilada do módulo que deseja transformar em jar, compacte-a com zip e altere a extensão da saída de zip para jar.

Yaniv
fonte
0
task deleteJar(type: Delete) {
    delete 'libs/mylibrary.jar'
}           

task exportjar(type: Copy) {
    from('build/intermediates/compile_library_classes/release/')
    into('libs/')
    include('classes.jar')
    rename('classes.jar', 'mylibrary.jar')
}

exportjar.dependsOn(deleteJar, build)
Md Imran Hossain Ku
fonte
0

Se você executar uma tarefa gradle no AndroidStudio [mais]

assembleRelease 
//or
bundleReleaseAar

ou via terminal

./gradlew <moduleName>:assembleRelease
//or
./gradlew <moduleName>:bundleReleaseAar

então você será capaz de encontrar .aarem

<project_path>/build/outputs/aar/<module_name>.aar
//if you do not see it try to remove this folder and repeat the command

.aarO arquivo (Biblioteca Android) consiste em um arquivo .jar(Biblioteca Java) e recursos Android adicionais. .aararquivo é um arquivo zip com aar extensão que é por isso que você pode substituir .aarcom .zipou correr

unzip "<path_to/module_name>.aar"
yoAlex5
fonte