保护jar文件的问题,如何找到丢失的jar?

2022-09-04 22:37:25

当我尝试使用Proguard导出我的apk时,我收到了很多类似于以下内容的错误(超过400个):

Warning: org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper: can't find superclass or interface javax.ws.rs.ext.ExceptionMapper

org.codehaus.jackson.xc.DataHandlerJsonDeserializer$1: can't find superclass or interface javax.activation.DataSource

我正在使用Jackson Json库,错误似乎与此有关。

研究此错误,我从Proguards FAQ中发现了以下内容:

如果存在对类或接口的未解析引用,则很可能忘记指定基本库。为了正确处理,必须指定代码引用的所有库,包括 Java 运行时库。要指定库,请使用 -libraryjars 选项。

在SO上搜索,我发现了很多与此相关的未解答问题,但一般的感觉是,我正在使用的jar文件(在本例中为Jackon JSON)依赖于更多的库,并且需要以某种方式将它们添加到Proguard的配置文件中。

但是,我无法弄清楚如何确定需要哪些罐子以及它们在哪里。警告提到了许多不同的软件包,例如javax.ws.rs.ext,org.joda.time,org.codehaus.stax2,javax.xml.stream等。

  1. 如何确定哪些罐子包含这些包?例如,javax.ws.rs.ext.** 类需要什么 jar?
  2. 我如何弄清楚这些jar在哪里,以及Proguard中的-libraryjars将使用什么路径?

非常感谢


编辑:我还应该提到我正在使用Android库项目设置。jar 位于主库项目中,实际工作项目具有其构建路径,包括库项目中的 jar。不知道这是否有所作为,但认为我应该提到它。


更新为了进行测试,我完全删除了远离构建路径和代码的jackson,现在Proguard成功完成。问题仍然存在...处理这些错误的正确方法是什么?

Eclipse 中的 Android 导出向导是否会自动将 /lib/ jar 添加到 proguard 中,或者它们都必须手动添加到 proguard 配置文件中,如下所示:

-libraryjars C:/Project/lib/somjar.jar

我确实为杰克逊尝试了一下,但它没有任何区别。这是否意味着我还必须找到警告中提到的类所需的所有jar并添加这些jar?它们是在 sdk 中还是在 Java 安装中?

抱歉,如果这些是愚蠢的问题,但我一直在努力解决这个问题,在过去的几个小时里,我不知道该怎么办。

再次感谢


再次更新

因此,在更多的搜索中,结合Benjamin的建议,我发现一些缺失的类在rt.jar中,它位于jdk的lib文件夹中。所以我最终添加了

-libraryjars  <java.home>/lib/rt.jar

对于proguard.cfg文件,并将警告从485降至204。嘿,我想那是什么东西...其余的警告描述了我根本找不到的类。该应用程序无需运行proguard即可正常工作,因此这些类必须在某个地方对吗?还是我应该使用这些警告?-dontwarn

其余类位于以下包中:

org.joda.time.
org.codehaus.stax2.
javax.ws.rs.

所以现在我只需要一种方法来弄清楚:

  1. 哪些罐子有这些类
  2. 这些jar在哪里,所以我可以将它们包含在proguard配置文件中

答案 1

我在Proguard上遇到了类似的问题,并且我使用osmdroid时遇到了类似的错误.jar它构建了OK而不受混淆。这个 jar 必须具有我的应用程序不需要的外部依赖项。幸运的是,作者列出了所需的jar,一旦我下载了它们并通过-libraryjars选项告诉Proguard,Proguard构建就可以了。

重新找回你丢失的罐子(你可能并不真正需要,但Proguard认为你可能会!),你应该在以下位置找到它们:

org.joda.time (罐子在拉链里面)

org.codehaus.stax2.

javax.ws.rs。


答案 2

我只能为第一部分提供答案:给

http://www.findjar.com

试一试,在那里你可能会找到所需jar文件的名称,就像这样


推荐