标签: jarjar

Android:错误包括/重新包装引用javax核心类的依赖项

我正在使用Maven作为构建工具开发Android应用程序.我设法正确设置了evertyhing(maven依赖项被导出到apk等),但是我还有一个问题让我发疯.

我想在我的POM文件中包含对simpleframework的xml解析器的依赖,如下所示:

<dependency>
    <groupId>org.simpleframework</groupId> 
    <artifactId>simple-xml</artifactId>
    <version>2.5.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

当我mvn install在项目上发布时,我收到以下错误(截断):

trouble processing "javax/xml/namespace/NameSpaceContext.class" ...
Run Code Online (Sandbox Code Playgroud)

我知道引用这些javax类的简单xml解析器的错误结果,但我还没有找到解决方案(设置--core-library标志是没用的).

我目前正试图用maven-jarjar-pluging重新打包依赖,但这似乎也不起作用.

任何人都可以帮我解决这个问题吗?很多,非常感谢提前!

java android jarjar maven simple-framework

14
推荐指数
1
解决办法
2917
查看次数

如何使用Maven创建一个JarJar'd工件,其中工件的使用不会提取传递依赖?

我目前有一个Java测试库,它是用Maven构建的,并以jar形式发布.我的项目依赖于一个非常常见的库(Objectweb ASM),并且我遇到过类似路径中已经存在早期且不兼容的ASM版本的问题.因此,我开始使用jarjar-maven-plugin来创建jar,在内部重新打包ASM,它不会与另一个版本的ASM冲突.

这执行得很好,我的库可以作为依赖项拉入,没有问题.

但是,因为我的项目在ASM上具有编译范围依赖性,所以每当客户端项目添加我的库时,传递依赖关系也都被拉入.因此,假设,如果他们使用特定版本的ASM,并且他们还将我依赖的版本添加到类路径中,则它们具有未定义的行为.我想避免这种情况,并允许客户端依赖JarJar'd工件,而不会让Maven不必要地和可能危险地降低传递依赖性.

如何创建一个JarJar'd工件,用户可以依赖它而不会提取传递依赖关系?

software-distribution classpath artifact jarjar maven

11
推荐指数
1
解决办法
3608
查看次数

如何使用zipfileset src属性而不必为我的所有jar手动指定它?

我目前有这个:

<jarjar destfile="a.jar" manifest="Manifest.mf">
  <zipfileset src="first.jar"/>
  <zipfileset src="second.jar"/>
</jarjar>
Run Code Online (Sandbox Code Playgroud)

问题是我必须手动指定每个jar,因为我需要考虑src参数.我想要这样的东西:

<zipfileset>
   <include name="*.jar"/>
<zipfileset>
Run Code Online (Sandbox Code Playgroud)

并将其内容提取并包含在我生成的存档中.这可能吗?

ant jarjar

11
推荐指数
2
解决办法
6017
查看次数

使用Jar Jar链接排除空目录

我正在使用Jar Jar Links中的Ant任务在我的可分发jar文件(example.jar)中嵌入来自第三方jar文件(objenesis)的类.Jar Jar会将原始包(org.objenesis)中的类翻译成我选择的类.

它工作但它在可分发的jar中留下空目录.

这是一个简化的build.xml:

<target name="jar" depends="compile">
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
        classpath="lib/jarjar-1.1.jar"/>

    <jarjar jarfile="dist/example.jar" excludes="org.objenesis.**">
        <fileset dir="build/classes/main"/>
        <zipfileset src="lib/objenesis-1.2.jar"/>
        <rule pattern="org.objenesis.**" result="org.thirdparty.@1"/>
    </jarjar>
</target>   
Run Code Online (Sandbox Code Playgroud)

example.jar的内容示例包括(如预期):

org/thirdparty/Objenesis.class
org/thirdparty/ObjenesisBase.class
Run Code Online (Sandbox Code Playgroud)

还有这些空目录(不合需要的):

org/objenesis/
org/objenesis/instantiator/
org/objenesis/instantiator/basic/
Run Code Online (Sandbox Code Playgroud)

我的问题:如何排除这些空目录?

我尝试了"zap"选项(在doc中列出),但是没有用.

ant jarjar

8
推荐指数
1
解决办法
2442
查看次数

如何使用Android的JarJar来更改外部jar的包名?

我似乎无法找到关于如何在Android项目中使用JarJar的任何明确说明.

I've got a scenario where my application project relies on two separate libraries, which both happen to use the same external .jar files. If I try to compile the application I get "Conversion to Dalvik format failed with error 1".

Can someone show me how to user JarJar on Android, using the build.xml file, in order to change the package name of a thirdparty .jar folder?

java ant android jarjar

8
推荐指数
1
解决办法
2449
查看次数

如何从命令行使用jarjar?

我无法从命令行使用jarjar将简单的Scala程序与scala运行时库结合起来.

jarjar正确检测依赖:

$ java -jar ~/Desktop/saug/jarjar-1.0.jar find jar BCT.jar scala-library.jar
/home/schani/Work/scala/bct/BCT.jar -> /home/schani/Work/scala/bct/scala-library.jar
Run Code Online (Sandbox Code Playgroud)

但是,将它们组合起来并不起作用:

$ CLASSPATH=./scala-library.jar java -jar ~/Desktop/saug/jarjar-1.0.jar process rules.jjl BCT.jar BCTS.jar
Run Code Online (Sandbox Code Playgroud)

我得到的jar文件仍然依赖于scala-library.jar.我是否添加CLASSPATH变量没有任何区别.我的rules.jjl文件如下所示:

keep BCT
Run Code Online (Sandbox Code Playgroud)

该怎么办?

java scala jar jarjar

5
推荐指数
1
解决办法
5987
查看次数

如何使用 jarjar 从默认包中重新打包 .class 文件?

是否可以将 jar 中的 .class 文件从默认包移动到另一个命名包,以便我可以导入和使用它们?

在这里浏览其他问题后,我认为 jarjar 可能正是我要找的,但我不知道如何使用它。

所以我的问题是如何使用 jarjar 将 .class 文件从默认包重新打包到另一个命名包?

编辑:我想澄清一些事情 - 我没有要重新打包的 jar 的来源,所以我不知道如何重新编译代码。混淆和反射是不可能的。

EDIT2:使用 jarjar 似乎非常简单:) java -jar jarjar.jar process rules.rules in.jar out.jar

rules.rules 看起来像这样: rule a net.ylivay.src.a

问题解决了!

java default package jarjar

5
推荐指数
1
解决办法
2452
查看次数

如何重新打包HttpClient 4.3.1并删除对commons-logging的依赖?

我想重新打包apache的httpclient lib,用一个Android应用程序发送它(比如https://code.google.com/p/httpclientandroidlib/但是使用HttpClient 4.3.1)

因此,我手动下载了httpclient 4.3.1 jar(包括其所有依赖项)并使用jarjar重新打包它:

x@x$: cd libs && for f in *.jar; do java -jar ../jarjar-1.4.jar process ../rules.txt $f out/my-$f; done
Run Code Online (Sandbox Code Playgroud)

使用rules.txt:

 rule org.apache.http.** my.repackaged.org.apache.http.@1
Run Code Online (Sandbox Code Playgroud)

然后我用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>
Run Code Online (Sandbox Code Playgroud)

我可以使用该文件来开发和测试我的应用程序,但如果我在android上部署它,它会抛出一个异常,就像它找不到my.repackaged.org.apache.logging.log4j.something引用的那样my.package.org.apache.logging.whatEver.

所以,现在我想通过使用字节码操作来消除对commons-logging的任何依赖.这已经在以前完成: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
...
Run Code Online (Sandbox Code Playgroud)

我认为要走的路是,删除这些依赖项并将其替换为自己的实现,就像他在此处所做的那样 …

android httpclient jarjar apache-commons-logging androidhttpclient

5
推荐指数
1
解决办法
2861
查看次数