Comment créer un .jar à partir d'un projet Android Studio

96

J'utilise AndroidStudio et j'ai ce projet comme indiqué:

entrez la description de l'image ici

Ce qui est à l'intérieur du cercle bleu est myLib. myLib doit également utiliser une bibliothèque externe qui se trouve à l'intérieur du cercle rouge et un package apache (cercle vert).

Je veux donc faire de tout cela un fichier .jar unique, afin que je puisse l'utiliser dans d'autres projets.

Un guide étape par étape serait vraiment apprécié, je suis un débutant dans le monde des développeurs.

Merci!

dum4ll3
la source
1
Je pense que ce que vous voulez, c'est un fichier aar (archive Android) que l'on peut relier discrètement comme dépendance. Fondamentalement, vous devez créer un projet de bibliothèque Android. Mais je ne peux pas écrire les étapes exactes de l'esprit.
rekire le
2
J'ai besoin d'un fichier .jar pour pouvoir l'utiliser dans n'importe quel projet java. Pas seulement Android.
dum4ll3
1
Doit être presque la même chose - créer un projet de bibliothèque et l'exporter.
Thrash Bean
Ce bogue décrit une carence dans le plugin Android gradle qui empêche de pirater facilement le fichier de construction gradle pour ajouter une cible jar ...
mmigdol

Réponses:

135
  • Ouvrez build.gradle pour le projet de bibliothèque entrez la description de l'image ici

  • Écrivez deux tâches dans build.gradle - deleteJar et createJar et ajoutez la règle createJar.dependsOn (deleteJar, build) entrez la description de l'image ici

Le code ci-dessus:

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)
  • Développez le panneau Gradle à partir de la droite et ouvrez toutes les tâches sous votre bibliothèque-> autres. Vous y verrez deux nouvelles tâches - createJar et deleteJar entrez la description de l'image ici

  • Double-cliquez sur createJar entrez la description de l'image ici

  • Une fois la tâche exécutée avec succès, récupérez votre fichier jar généré à partir du chemin mentionné dans la tâche createJar, c'est-à-dire libs / xxxx.jar entrez la description de l'image ici

  • copiez le fichier jar nouvellement généré dans le dossier lib de votre projet requis -> clic droit -> sélectionnez "ajouter comme bibliothèque"

Abhinav Tyagi
la source
4
Parfois, les gens comprennent en regardant plutôt qu'en lisant. C'est un bon UX que vous voyez ☺
Abhinav Tyagi
5
Eh bien, je devrais vous dire que je n'en suis pas sûr release. J'ai debuget default, mais pas de releasedossier. Quelle version du plugin utilisez-vous? Savez-vous si cela est documenté quelque part?
Cameron Lowell Palmer
3
Je n'ai pas de releasedossier.
Kamran Bigdely
4
Qu'essayez-vous de copier? Sommes-nous censés cibler les dossiers contenant le fichier APK ?? Je veux dire dans la ligne de ('build / intermediates / bundles / default') que contient ce répertoire pour vous. Il n'y a pas de dossier dans mon studio Android avec les lots de noms, et je continue de recevoir AUCUNE SOURCE dans la tâche
createJar
12
changement de ('build / intermediates / bundles / release /') à de ('build / intermediates / packaged-classes / release /') pour Android Studio 3.1.3 et Gradle version 4.4
Vaishakh
59

Si vous configurez le code en tant que module Java simple dans Gradle, il est vraiment facile de demander à Gradle de vous donner un fichier jar avec le contenu. Ce fichier jar n'aura que votre code, pas les autres bibliothèques Apache dont il dépend. Je recommanderais de le distribuer de cette façon; c'est un peu étrange de regrouper les dépendances dans votre bibliothèque, et il est plus normal que les utilisateurs de ces bibliothèques doivent inclure ces dépendances par eux-mêmes (car sinon, il y a des collisions de ces projets qui lient déjà des copies de la bibliothèque, peut-être de versions différentes ). De plus, vous évitez les problèmes de licence potentiels liés à la redistribution du code d'autres personnes si vous deviez publier votre bibliothèque.

Prenez le code qui doit également être compilé dans un fichier jar et déplacez-le vers un module Java simple séparé dans Android Studio:

  1. Menu Fichier > Nouveau module ... > Bibliothèque Java
  2. Configurez la bibliothèque, le nom du package Java et les noms de classe dans l'assistant. (Si vous ne souhaitez pas qu'il crée une classe pour vous, vous pouvez simplement le supprimer une fois le module créé)
  3. Dans votre code Android, configurez une dépendance sur le nouveau module afin qu'il puisse utiliser le code dans votre nouvelle bibliothèque:
  4. Fichier > Structure du projet > Modules > (votre module Android) > Dépendances > + > Dépendance du module . Voir la capture d'écran ci-dessous: entrez la description de l'image ici
  5. Choisissez votre module dans la liste de la boîte de dialogue qui apparaît: entrez la description de l'image ici

J'espère que votre projet devrait se construire normalement maintenant. Après avoir fait une compilation, un fichier jar pour votre bibliothèque Java sera placé dans le répertoire build / libs du répertoire de votre module. Si vous souhaitez créer le fichier jar à la main, vous pouvez exécuter sa tâche de création de fichier jar à partir de la fenêtre Gradle: entrez la description de l'image ici

Scott Barta
la source
Merci beaucoup! Votre réponse a été vraiment utile, la plupart dans la dernière capture d'écran qui montre les tâches Gradle. Je ne savais pas ça. Je pourrais suivre vos étapes, mais il me manque toujours le org.apache.http.Header. Comment puis-je l'importer dans ma bibliothèque?
dum4ll3
Que voulez-vous dire quand vous dites que vous le manquez?
Scott Barta
1
Suivez le même flux Structure de projet> dépendances, mais choisissez votre module de bibliothèque au lieu de votre projet et ajoutez la dépendance de la même manière. Dans ma réponse, je dis qu'il met le fichier jar dans le répertoire build / libs dans son répertoire de module.
Scott Barta
1
J'ai obtenu: java.lang.NoClassDefFoundError: com.loopj.android.http.RequestParams. C'est ma bibliothèque externe que je compile avec la mienne.
dum4ll3
2
Il fonctionne uniquement avec la bibliothèque java et la tâche jar dans la bibliothèque Android n'existe pas
cuasodayleo
26

Dans l'IDE d'Android Studio, accédez à la barre " Exécuter tout " en:

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

Après cela, vous trouverez votre artefact dans ce dossier de votre projet
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


OU


Gradle a déjà un Taskpour cela, dans le menu latéral de gradle, sous le otherdossier.

barre d'outils Gradle

Faites ensuite défiler vers le bas createFullJarReleaseet cliquez dessus.

Tâches Gradle

Après cela, vous trouverez votre artefact dans ce dossier de votre projet

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

Haroun Hajem
la source
2
Impossible de voir cette option. Cela a-t-il été ajouté sur une version récente de Studio?
Dibzmania
1
Je construis et quand trouve * .jar son nom est: full.jar. 30mins pour le trouver lol
nobjta_9x_tq
1
Dans mon cas, je l'ai trouvé dansbuild\intermediates\intermediate-jars\release
Yusril Maulidan Raji
J'ai une question. Dans mon cas, il génère 3 fichiers jar. classes.jar, full.jaret res.jar. Dois-je importer tous les fichiers JAR chaque fois que je veux l'utiliser?
Yusril Maulidan Raji
Utilisez simplement le fichier full.jar
Haroun Hajem
11

Ajoutez simplement ceci à build.gradle de votre module java. Il inclura les bibliothèques dépendantes dans l'archive.

mainClassName = "com.company.application.Main"

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

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

Cela donnera le fichier [nom_module] / build / libs / [nom_module] .jar.

Bao Le
la source
Mais une bibliothèque .jar aurait-elle une classe Main? L'OP dit qu'ils construisent un fichier .jar "pour que je puisse l'utiliser dans un autre projet" (sic). Cela ressemble à une bibliothèque.
Steve White
Seul ce type l'a compris, la création de pots ne résout pas le problème. et si nous devons l'exécuter. Le code ci-dessus évite l'erreur "Impossible d'exécuter le fichier jar:" aucun attribut manifeste principal "".
MobileEvangelist
1

Le fichier .jar sera automatiquement généré lorsque vous compilez / exécutez votre application.

Vous pouvez trouver votre fichier class.jar dans dossier_racine / app / build / intermediates / bundles / debug

emplacement du fichier jar

Sonia John Kavery
la source
1
  1. Accédez à l'onglet Gradle dans Android Studio, puis sélectionnez le projet de bibliothèque.

  2. Ensuite, allez dans Tâches

  3. Ensuite, allez à Autre

  4. Double-cliquez sur le bundleReleaseaar

Vous pouvez trouver vos .aarfichiers sousyour_module/build/outputs/aar/your-release.aar

Ici l'image

Damo Gurcinovski
la source
Je ne vois aucun "Gradle Tab" nulle part. Enfin, j'ai tapé "Gradle" dans la recherche d'aide et j'ai obtenu quelque chose comme votre vue Gradle. Mais la liste à l'intérieur est très différente, beaucoup plus courte que la vôtre. Il n'y a pas de bundleReleaseaar sous Tâches-> Autre. Il y a un "createJar", mais quand je clique dessus, j'obtiens "Task 'createJar' not found in root project ..." Je suis bloqué. Et ... pourquoi voulons-nous des fichiers .aar? L'OP a demandé un fichier .jar. Est-ce la même chose>
Steve White
Mais la question est de savoir comment faire .jarnon.aar
Aleksey Timoshchenko
0

la façon dont j'ai trouvé était de trouver la sortie du compilateur du projet (structure du projet> projet). puis trouvez le dossier conforme du module que vous souhaitez transformer en jar, compressez-le avec zip et changez l'extension de la sortie de zip en jar.

yaniv
la source
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
la source
0

Si vous exécutez une tâche de gradation depuis AndroidStudio [Plus]

assembleRelease 
//or
bundleReleaseAar

ou via le terminal

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

alors vous pourrez trouver .aardans

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

.aarLe fichier (Android Library) se compose d'un fichier .jar(Java Library) et de ressources Android supplémentaires. .aarfichier est un fichier zip avec AAR extension qui est la raison pour laquelle vous pouvez remplacer .aaravec .zipou courir

unzip "<path_to/module_name>.aar"
yoAlex5
la source