So erstellen Sie aus einem Android Studio-Projekt eine .jar-Datei

96

Ich benutze AndroidStudio und habe dieses Projekt wie folgt:

Geben Sie hier die Bildbeschreibung ein

Was sich innerhalb des blauen Kreises befindet, ist myLib. myLib muss außerdem eine externe Bibliothek verwenden, die sich innerhalb des roten Kreises befindet, und ein Apache-Paket (grüner Kreis).

Also möchte ich diese ganze Sache zu einer einzigen .jar machen, damit ich sie in anderen Projekten verwenden kann.

Eine Schritt-für-Schritt-Anleitung wäre sehr dankbar, ich bin ein Anfänger in der Entwicklerwelt.

Vielen Dank!

dum4ll3
quelle
1
Ich denke, was Sie wollen, ist eine AAR-Datei (Android-Archiv), die man ganz einfach als Abhängigkeit verknüpfen kann. Grundsätzlich müssen Sie ein Android-Bibliotheksprojekt erstellen. Aber ich kann die genauen Schritte nicht aus dem Kopf schreiben.
rekire
2
Ich benötige eine JAR-Datei, damit ich sie in jedem Java-Projekt verwenden kann. Nicht nur Android.
dum4ll3
1
Muss fast gleich sein - erstelle ein Bibliotheksprojekt und exportiere es.
Thrash Bean
Dieser Fehler beschreibt einen Mangel im Android-Gradle-Plugin, der verhindert, dass das Gradle-Buildfile leicht gehackt wird, um ein JAR-Ziel hinzuzufügen ...
mmigdol

Antworten:

135
  • Öffnen Sie build.gradle für das Bibliotheksprojekt Geben Sie hier die Bildbeschreibung ein

  • Schreiben Sie zwei Aufgaben in build.gradle - deleteJar und createJar und fügen Sie die Regel createJar.dependsOn hinzu (deleteJar, build) Geben Sie hier die Bildbeschreibung ein

Der Code von oben:

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)
  • Erweitern Sie das Gradle-Bedienfeld von rechts und öffnen Sie alle Aufgaben unter Ihrer Bibliothek-> Andere. Dort sehen Sie zwei neue Aufgaben - createJar und deleteJar Geben Sie hier die Bildbeschreibung ein

  • Doppelklicken Sie auf createJar Geben Sie hier die Bildbeschreibung ein

  • Sobald die Aufgabe erfolgreich ausgeführt wurde, rufen Sie Ihr generiertes JAR aus dem in createJar task, dh libs / xxxx.jar, angegebenen Pfad ab Geben Sie hier die Bildbeschreibung ein

  • Kopieren Sie das neu generierte JAR in den lib-Ordner Ihres gewünschten Projekts -> Rechtsklick -> Wählen Sie "Als Bibliothek hinzufügen".

Abhinav Tyagi
quelle
4
Manchmal verstehen Menschen das eher durch Betrachten als durch Lesen. Es ist eine gute UX, die Sie sehen ☺
Abhinav Tyagi
5
Dann sollte ich Ihnen sagen, dass ich mir nicht sicher bin release. Ich habe debugund default, aber keinen releaseOrdner. Welche Version des Plugins verwenden Sie? Wissen Sie, ob dies irgendwo dokumentiert ist?
Cameron Lowell Palmer
3
Ich habe keinen releaseOrdner.
Kamran Bigdely
4
Was versuchst du zu kopieren? Sollen wir auf die Ordner abzielen, die die APK-Datei enthalten? Ich meine in der Zeile von ('build / intermediates / bundles / default'), was dieses Verzeichnis für Sie enthält. In meinem Android-Studio gibt es keinen Ordner mit den Namensbündeln, und ich bekomme immer wieder KEINE QUELLE in der Aufgabe
createJar
12
Wechseln Sie von ('build / intermediates / bundles / release /') zu ('build / intermediates / packaged-classes / release /') für Android Studio 3.1.3 und Gradle Version 4.4
Vaishakh
59

Wenn Sie den Code in Gradle als einfaches Java-Modul einrichten, ist es wirklich einfach, dass Gradle Ihnen eine JAR-Datei mit dem Inhalt zur Verfügung stellt. Diese JAR-Datei enthält nur Ihren Code, nicht die anderen Apache-Bibliotheken, von denen sie abhängt. Ich würde empfehlen, es auf diese Weise zu verteilen. Es ist etwas seltsam, Abhängigkeiten in Ihrer Bibliothek zu bündeln, und es ist normaler, dass Benutzer dieser Bibliotheken diese Abhängigkeiten selbst einbeziehen müssen (da es sonst zu Kollisionen dieser Projekte kommt, die bereits Kopien der Bibliothek verknüpfen, möglicherweise verschiedener Versionen ). Darüber hinaus vermeiden Sie potenzielle Lizenzprobleme bei der Neuverteilung des Codes anderer Personen, wenn Sie Ihre Bibliothek veröffentlichen.

Nehmen Sie den Code, der ebenfalls kompiliert werden muss, in ein JAR und verschieben Sie ihn in ein separates einfaches Java-Modul in Android Studio:

  1. Menü Datei > Neues Modul ... > Java-Bibliothek
  2. Richten Sie die Bibliothek, den Java-Paketnamen und die Klassennamen im Assistenten ein. (Wenn Sie nicht möchten, dass eine Klasse für Sie erstellt wird, können Sie sie einfach löschen, sobald das Modul erstellt wurde.)
  3. Richten Sie in Ihrem Android-Code eine Abhängigkeit vom neuen Modul ein, damit es den Code in Ihrer neuen Bibliothek verwenden kann:
  4. Datei > Projektstruktur > Module > (Ihr Android-Modul) > Abhängigkeiten > + > Modulabhängigkeit . Siehe den Screenshot unten: Geben Sie hier die Bildbeschreibung ein
  5. Wählen Sie Ihr Modul aus der Liste im daraufhin angezeigten Dialogfeld aus: Geben Sie hier die Bildbeschreibung ein

Hoffentlich sollte Ihr Projekt jetzt normal aufgebaut werden. Nach dem Erstellen wird eine JAR-Datei für Ihre Java-Bibliothek im Verzeichnis build / libs im Verzeichnis Ihres Moduls abgelegt . Wenn Sie die JAR-Datei von Hand erstellen möchten, können Sie die JAR- Build-Datei-Aufgabe im Gradle-Fenster ausführen : Geben Sie hier die Bildbeschreibung ein

Scott Barta
quelle
Vielen Dank! Ihre Antwort war wirklich hilfreich, vor allem im letzten Screenshot, der die Gradle-Aufgaben zeigt. Das wusste ich nicht. Ich könnte Ihren Schritten folgen, aber mir fehlt immer noch der org.apache.http.Header. Wie kann ich es in meine Bibliothek importieren?
dum4ll3
Was meinst du, wenn du sagst, dass du es vermisst?
Scott Barta
1
Gehen Sie dieselbe Projektstruktur> Abhängigkeitsfluss durch, wählen Sie jedoch Ihr Bibliotheksmodul anstelle Ihres Projekts aus und fügen Sie die Abhängigkeit auf dieselbe Weise hinzu. In meiner Antwort sage ich, dass die JAR-Datei im Verzeichnis build / libs in ihrem Modulverzeichnis abgelegt wird.
Scott Barta
1
Ich habe: java.lang.NoClassDefFoundError: com.loopj.android.http.RequestParams. Das ist meine externe Bibliothek, die ich mit meiner kompiliere.
dum4ll3
2
Es funktioniert nur mit Java-Bibliothek, und JAR-Aufgabe in Android-Bibliothek nicht vorhanden
Cuasodayleo
26

Greifen Sie in der Android Studio-IDE auf die Leiste " Alles ausführen " zu, indem Sie:

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

Danach finden Sie Ihr Artefakt in diesem Ordner in Ihrem Projekt
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


ODER


Gradle hat dafür bereits ein Taskim Gradle- Seitenmenü unter dem otherOrdner.

Gradle-Symbolleiste

Scrollen Sie dann nach unten createFullJarReleaseund klicken Sie darauf.

Gradle Aufgaben

Danach finden Sie Ihr Artefakt in diesem Ordner in Ihrem Projekt

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

Haroun Hajem
quelle
2
Diese Option kann nicht angezeigt werden. Wurde dies in einer aktuellen Studio-Version hinzugefügt?
Dibzmania
1
Ich baue und wenn ich * .jar finde, heißt es: full.jar. 30 Minuten, um es zu finden lol
nobjta_9x_tq
1
In meinem Fall fand ich es inbuild\intermediates\intermediate-jars\release
Yusril Maulidan Raji
Ich habe eine Frage. In meinem Fall werden 3 JAR-Dateien generiert. classes.jar, full.jarUnd res.jar. Sollte ich alle JAR-Dateien importieren, wann immer ich sie verwenden möchte?
Yusril Maulidan Raji
Verwenden Sie einfach die full.jar
Haroun Hajem
11

Fügen Sie dies einfach dem build.gradle Ihres Java-Moduls hinzu. Es werden abhängige Bibliotheken in das Archiv aufgenommen.

mainClassName = "com.company.application.Main"

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

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

Dies führt zur Datei [Modulname] / build / libs / [Modulname] .jar.

Bao Le
quelle
Aber hätte eine .jar-Bibliothek eine Hauptklasse? Das OP sagt, dass sie eine .jar-Datei erstellen, "damit ich sie in anderen Projekten verwenden kann" (sic). Das klingt nach einer Bibliothek.
Steve White
Nur dieser Typ hat das wirklich verstanden, nur die Erstellung eines Glases löst das Problem nicht. Was ist, wenn wir es ausführen müssen? Der obige Code vermeidet den Fehler "JAR-Datei kann nicht ausgeführt werden:" Kein Hauptmanifestattribut "".
MobileEvangelist
1

Die JAR-Datei wird automatisch generiert, wenn Sie Ihre Anwendung kompilieren / ausführen.

Sie finden Ihre class.jar-Datei unter root_folder / app / build / intermediates / bundles / debug

Speicherort der JAR-Datei

Sonia John Kavery
quelle
1
  1. Gehen Sie in Android Studio zur Registerkarte Gradle und wählen Sie dann Bibliotheksprojekt aus.

  2. Gehen Sie dann zu Aufgaben

  3. Dann gehe zu Andere

  4. Doppelklicken Sie auf bundleReleaseaar

Sie finden Ihre .aarDateien unteryour_module/build/outputs/aar/your-release.aar

Hier Bild

Damo Gurcinovski
quelle
Ich sehe nirgendwo einen "Gradle Tab". Schließlich habe ich "Gradle" in die Hilfesuche eingegeben und so etwas wie Ihre Gradle-Ansicht erhalten. Aber die Liste darin ist sehr unterschiedlich, viel kürzer als deine. Unter Aufgaben-> Andere gibt es kein BundleReleaseaar. Es gibt ein "createJar", aber wenn ich darauf klicke, wird "Task 'createJar' nicht im Root-Projekt gefunden ..." angezeigt. Ich stecke fest. Und ... warum wollen wir .aar-Dateien? Das OP bat um eine JAR-Datei. Ist das dasselbe>
Steve White
Aber Frage ist, wie man .jarnicht macht.aar
Aleksey Timoshchenko
0

Ich fand die Ausgabe des Projekt-Compilers (Projektstruktur> Projekt). Suchen Sie dann den entsprechenden Ordner des Moduls, das Sie in ein Glas verwandeln möchten, komprimieren Sie es mit zip und ändern Sie die Erweiterung der Ausgabe von zip in jar.

Yaniv
quelle
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
quelle
0

Wenn Sie eine Gradle-Aufgabe von AndroidStudio aus ausführen [Mehr]

assembleRelease 
//or
bundleReleaseAar

oder über Terminal

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

dann finden Sie .aarin

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

.aarDie Datei (Android Library) besteht aus einer Datei .jar(Java Library) und zusätzlichen Android-Ressourcen. .aarDatei ist eine ZIP - Datei mit AAR - Erweiterung , die ist , warum Sie ersetzen können .aarmit .zipoder Lauf

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