Wie packe ich HttpClient 4.3.1 neu und entferne Abhängigkeiten von Commons-Logging?

Ich möchte die httpclient lib von apache neu packen, um sie mit einer Android - App (wie zhttps://code.google.com/p/httpclientandroidlib/ aber mit HttpClient 4.3.1)

Deshalb habe ichheruntergeladen Die httpclient 4.3.1-JAR-Datei (einschließlich aller Abhängigkeiten) wurde von Hand erstellt und mithilfe von JARJAR neu gepackt:

x@x$: cd libs && for f in *.jar; do java -jar ../jarjar-1.4.jar process ../rules.txt $f out/my-$f; done

mitrules.txt:

 rule org.apache.http.** my.repackaged.org.apache.http.@1

Dann habe ich mit ant die Ausgabe zusammengestellt:

<project name="MyProject" default="merge" basedir=".">
  <target name="merge">
        <zip destfile="my-org-apache-httpclient-4.3.1.jar">
            <zipgroupfileset dir="libs/out" includes="*.jar"/>
        </zip>
  </target>
</project>

Ich kann diese Datei verwenden, um meine App zu entwickeln und zu testen, aber wenn ich sie auf Android bereitstelle, löst sie eine Ausnahme aus, die nicht gefunden werden kannmy.repackaged.org.apache.logging.log4j.something referenziert vonmy.package.org.apache.logging.whatEver.

Jetzt möchte ich die Abhängigkeit von Commons-Logging durch die Verwendung von Bytecode-Manipulationen beseitigen. Dies wurde bereits gemacht vor:http://sixlegs.com/blog/java/dependency-killer.html

Aber ich frage mich, wie ich das eigentlich mache? Es gibt nur Abhängigkeiten von org.apache.commons.logging.Log:

x$x$: java -jar jarjar-1.4.jar find jar my-org-apache-httpclient-4.3.1.jar commons-logging-1.1.3.jar
my/http/impl/execchain/ServiceUnavailableRetryExec -> org/apache/commons/logging/Log
my/http/impl/execchain/RetryExec -> org/apache/commons/logging/Log
my/http/impl/execchain/RedirectExec -> org/apache/commons/logging/Log
my/http/impl/execchain/ProtocolExec -> org/apache/commons/logging/Log
...

Ich denke, der Weg ist, diese Abhängigkeiten zu entfernen und durch eine eigene Implementierung zu ersetzen, wie er es hier getan hathttps://code.google.com/p/httpclientandroidlib/ . Deshalb habe ich mit nur einer Klasse ein neues Maven-Projekt gemachtprovided Bereich für die Commons-Protokollierung, die die org.apache.commons.logging.Log-Schnittstelle implementiert und nur an die delefiertandroid.utils.Log:

MyLog implements org.apache.commons.logging.Log {}

im Paketmy.log und ich habe das in my-log-1.0.0.jar gepackt. Ich habe diese JAR-Datei in den gleichen Ordner wie die neu gepackten httpclient-JAR-Dateien gestellt und mit ant, wie oben erwähnt, alles zusammen in my-org-apache-httpclient-4.3.1.jar gepackt.

Ansatz 1

Ich habe versucht, Jarjar wieder zu verwenden:

java -jar jarjar-1.4.jar process rules2.txt my-org-apache-httpclient-4.3.1.jar my-org-apache-httpclient-4.3.1-without-logging-dep.jar

mitrules2.txt:

rule my.repackaged.commons.logging.** my.log.@1

aber das funktioniert nicht. Die Ausnahme, die es nicht finden kannmy.repackaged.org.apache.logging.log4j.something referenziert vonmy.package.org.apache.logging.whatEver wird immer noch geworfen.

Ansatz 2

Ich habe auch versucht, das Protokollierungsmaterial aus dem endgültigen Glas zu löschen und / oder die Datei my.repackaged.org.apache.log4j neu zu verpacken und in die ursprünglichen Pakete zu protokollieren:

rules2.txt v2:

rule my.repackaged.org.apache.log4j.** org.apache.log4j.@1
rule my.repackaged.org.apache.logging.** org.apache.logging.@1

aber das wirft auch noch die aufregung:my.repackaged.org.apache.logging.log4j.something referenziert vonmy.package.org.apache.logging.whatEver

FRAGE

Wie kann ich diese Commons-Logging-Abhängigkeiten töten / ersetzen und die Exception loswerden?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage