Как переупаковать HttpClient 4.3.1 и удалить зависимости от общего журнала?
Я хочу упаковать httpclient lib Apache, чтобы отправить его с приложением для Android (например,https://code.google.com/p/httpclientandroidlib/ но с HttpClient 4.3.1)
следовательно, язагруженный jar httpclient 4.3.1 (включает все его зависимости) вручную и использовал jarjar для его перепаковки:
x@x$: cd libs && for f in *.jar; do java -jar ../jarjar-1.4.jar process ../rules.txt $f out/my-$f; done
с участиемRules.txt:
rule org.apache.http.** my.repackaged.org.apache.http.@1
Затем я использовал ant, чтобы соединить вывод:
<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>
Я могу использовать этот файл для разработки и тестирования своего приложения, но если я разверну его на Android, оно выдаст исключение s / th, как будто оно не может найтиmy.repackaged.org.apache.logging.log4j.something
ссылается наmy.package.org.apache.logging.whatEver
.
Итак, теперь я хочу избавиться от любой зависимости от ведения журнала с помощью использования байт-кода. Это было сделано раньше:http://sixlegs.com/blog/java/dependency-killer.html
Но мне интересно, как я на самом деле это делаю? Есть только зависимости от 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
...
Я думаю, что путь состоит в том, чтобы удалить эти зависимости и заменить его собственной реализацией, как он сделал здесьhttps://code.google.com/p/httpclientandroidlib/ , Поэтому я сделал новый проект Maven только с одним классом сprovided
область для регистрации общего достояния, которая реализует интерфейс org.apache.commons.logging.Log и просто удаляет файлы вandroid.utils.Log
:
MyLog implements org.apache.commons.logging.Log {}
в упаковкеmy.log
и я упаковал это в my-log-1.0.0.jar. Я поместил этот jar в ту же папку, что и перепакованные httpclient-jars, и использовал ant, как упомянуто выше, чтобы упаковать все вместе в my-org-apache-httpclient-4.3.1.jar.
Подход 1
Я попытался использовать jarjar снова:
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
с участиемrules2.txt:
rule my.repackaged.commons.logging.** my.log.@1
но это не работает. Исключение, которое он не может найтиmy.repackaged.org.apache.logging.log4j.something
ссылается наmy.package.org.apache.logging.whatEver
все еще брошен.
Подход 2
Я также попытался удалить материал журналирования из окончательного jar и / или перепаковать my.repackaged.org.apache.log4j и войти в его исходные пакеты:
rules2.txt v2:
rule my.repackaged.org.apache.log4j.** org.apache.log4j.@1
rule my.repackaged.org.apache.logging.** org.apache.logging.@1
но это также все еще бросает исключение:my.repackaged.org.apache.logging.log4j.something
ссылается наmy.package.org.apache.logging.whatEver
ВОПРОС
Как я могу убить / заменить эти зависимости общего журнала и избавиться от исключения?