Build.gradle für mehrere JARs konfigurieren

(Editiert, Originaltitel: build.gradle so konfigurieren dass es mehrere .jar’s z.b. mit org.junit erlaubt, oder das ANT-Skript so einstellen dass es z.B. verhindert ein Verzeichnis org/junit reinzupacken)

  • Also ersteres scheint wieder mal völlig unmöglich zu sein - und zwar für den Fall dass ich bei mehreren selbst gepackten .jar-Libraries (Bis jetzt ein HTTP- sowie ein SMTP-Client) halt noch die für die JUnit-Test erforderlichen Abhängigkeiten „reinpacke“… es ist dann halt der Fall, dass mehrere .jar’s das Verzeichnis org/junit/... inne haben.

Dann reklamiert natürlich Android Studio über die versch. JAR-Dateien mit redundanten Daten, klar. Aber da kann man zum exclude-Parameter im „Rumpf“ von gradle.config’s compile- oder implementation-Einträgen wieder mal das halbe Internet durchforsten und man findet im Prinzip nur nicht-funktionierenden Quatsch…

Mit 2 „normalen“ Klammern:

implementation files('libs\\AndroidCompatibleSMTPClient.jar') {
...
}

Mit 4 „normalen“ Klammern:

implementation files(('libs\\AndroidCompatibleSMTPClient.jar')) {
...
}

Was den Inhalt des Rumpfs (also innerhalb von { … }) betrifft, so gibt’s schätzungsweise 27 im Netz beschriebene Varianten - dabei funktioniert KEINE EINZIGE (!!!). Auf das kann ich jetzt nicht weiter eingehen, da ich schätzungsweise 3 Stunden brauchen würde um die ganzen 27 im Internet beschriebenen Möglichkeiten aufzufinden

Was ich bei ANT machen soll, damit es VON ANFANG AN verhindert, irgendwelche Abhängigkeiten reinzupacken ist mir irgendwie auch völlig unklar.

Nun habe ich es jedenfalls so gelöst:


        <!-- Custom { -->
        <unzip src="${dir.jarfile}/AndroidCompatibleHTTPClient.jar" dest="C:/Windows/Temp/AndroidCompatibleHTTPClient" />
        <delete file="C:/Windows/Temp/AndroidCompatibleHTTPClient/LICENSE-junit.txt" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleHTTPClient/junit" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleHTTPClient/org/junit" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleHTTPClient/org/hamcrest" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleHTTPClient/org/apache" />
        <delete file="AndroidCompatibleHTTPClient.jar" />
        <zip basedir="C:/Windows/Temp/AndroidCompatibleHTTPClient" destfile="AndroidCompatibleHTTPClient.jar" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleHTTPClient" />
        <!-- } Custom -->  

Oder aber auch so:


        <!-- Custom { -->
        <unzip src="${dir.jarfile}/AndroidCompatibleSMTPClient.jar" dest="C:/Windows/Temp/AndroidCompatibleSMTPClient" />
        <delete file="C:/Windows/Temp/AndroidCompatibleSMTPClient/LICENSE-junit.txt" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleSMTPClient/junit" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleSMTPClient/org/junit" />
        <delete file="AndroidCompatibleSMTPClient.jar" />
        <zip basedir="C:/Windows/Temp/AndroidCompatibleSMTPClient" destfile="AndroidCompatibleSMTPClient.jar" />
        <delete dir="C:/Windows/Temp/AndroidCompatibleSMTPClient" />
        <!-- } Custom -->

…vielleicht kann mit aber jemand einen „vernünftigeren“ Weg darlegen?

a.) Entweder ein „sauberes“ ANT-Script, bei dem von ANFANG AN verhindert wird dass das Zeugs reingeht - also nix im Nachhinein rauslöschen

ODER

b.) gradle.config so konfiguirieren dass es .jar-Dateien mit mehreren gleichen Einträgen mit .class-Files erlaubt.

Besten Dank für die Feedbacks.

Mit Gradle, Android und Ant kenne ich mich nicht aus (ich bin alt :older_man: … so alt, dass ich manchmal noch [CODE] tags verwende :stuck_out_tongue_winking_eye: ). Aber für mich klingt da schon der Anfang seeeehr suspekt:

Wenn das wirklich bedeutet, dass du die junit.jar auspackst und die .class-Dateien (order sogar sourcen?) in ein eigenes Verzeichnis legst, dann kann ich nur sagen: Mach’ das nicht. Was auch immer der Zweck davon ist: Eigentlich sollte man irgendwo, irgendwie sagen können: „Joa, für junit ist eine dependency, und die wird nur für Tests benötigt“ (d.h. die sollte für deine „Release JAR“ am Ende ja gar keine Rolle spielen).

Spricht etwas dagegen, diese JUnit-Sachen, die du da am Ende mit (zugegeben: höchst kreativen :wink: ) Ant-Scripten aus deinen JARs rausschälst, von Anfang an nicht mit dazu zu packen?

Nein, ich entpacke die fertige EIGENE .jar-Library (die main-funktion ist nur pseudo-mässig, damit Eclipse überhaupt in der Lage ist ein .jar zu generieren) welche von mir stammt und in die vorher beim Eclipse-Export die vorhandenen Abhängigkeit mit „reingepackt“ wurden, u.A. JUnit.

Dann entpacke ich die „AndroidCompatibleSMTPClient.jar“ nach C:\windows\Temp, lösche anschliessend C:\windows\temp\AndroidCompatibleSMTP\AndroidCompatibleSMTPClient\org\junit und noch ein paar andere Sachen und packe das ganz erneut per ant-zip-Tag zu einem .jar zusammen. (.jar ist ja bekanntlich zip und nicht rar, wie viele meinen)

„Mit Gradle, Android und Ant kenne ich mich nicht aus (ich bin alt :older_man: … so alt“

Dito, mit 37 bin ich auch schon relativ alt, das ganze Zeugs ist doch was für Smartphone-Kiddie-Hipster-Informatiker… erwachsene, reife Männer bevorzugen doch eher J2EE!! :wink: