胜利!
似乎至少有两个人比我对 Maven 更一无所知,所以在我报告这篇文章底部的修复之前让我解释一下我在做什么(剧透警告:它看起来是 JarJar 中的一个错误)。
Android 使用 Java,但缺少很多 Java 核心(特别是 javax 类)。Android DEX 编译器(将 .jars 转换为 Android .dex 文件)甚至不允许您在 java.* 或 javax.* 命名空间中编译内容,因为它(通常)会破坏内容。但是,在某些(许多)情况下,您可能希望包含一些例程——特别是因为它们被现有库使用。最具传奇色彩的是 StAX,这就是为什么 Google在 Dalvik repo 的 wiki 中发布了一个如何将其包含在此处的示例。该示例使用 JarJar... 和 ant。当您不使用存储库时,传递依赖关系并不是真正的问题,因此在 wiki 中没有解决它们。
我能够让 JarJar 使用 Maven 在我的源代码上运行,但无需更改依赖项(和传递依赖项)中的命名空间,这是毫无价值的。因此我的问题。
我认为 copy-dependencies 插件可能对...复制依赖项并在此过程中运行转换插件很有用。在官方的“Maven in 5 minutes”文档中提到了复制依赖项作为一个步骤,所以这似乎是一个好的开始,但可能编写官方文档的人不知道如何使用它:-)。无论哪种方式,它都没有帮助 - 我无法看到在复制罐子时转换罐子的简单方法。
使用 Maven 的详细信息,我可以看到 Jar Jar实际上正在正确处理我的 jars……然后丢弃结果。它会将转换后的类从我的工件中的传递依赖项与我的其余代码打包,但相反,它“排除”了它们。Jar Jar 参数基本上没有记录,大多数标签甚至没有在文档中列出,但我能找到的所有示例都使用带有通配符的部分,告诉它要保留哪些类。至少我认为(认为?)这就是该部分的用途。相反,它似乎随机扔掉东西。基本上,该部分被破坏了。例如,我有:
<keep>
<pattern>com.example.**</pattern>
</keep>
...认为这将保留以 com.example 开头的类。错误的。它保留它想要的任何东西。我在那个地方尝试了一百万件事,直到一个工作:
<keep>
<pattern>*.**</pattern>
</keep>
这只会保留我想要的类——它更新的类和它没有触及的类的原件。请注意,**
这甚至不起作用。这是 JarJar 插件的 1.8 版(我发现大多数 pom 使用的版本)。
回去工作。