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?