-1

我正在建立一个依赖于 Maven 存储库中的库(Jettison 等)的(java)maven 项目。而 Jettison 则依赖于 stax。我需要在 stax 上运行一个工具(Jar Jar Links)(以更改命名空间)。如何更改 Maven 项目中传递依赖项的规则?使用 copy-dependencies 目标将我的传递依赖项包含在我的目标文件夹中(我假设这是通常的完成方式)。我假设这是插件将在传递生成的工件上运行的点。

额外的问题:此时我不需要这个,但我将如何改变传递依赖中的源?我可以得到源的 jar,mvn dependency:sources但是,从那里,我不确定正确的方法是什么。

4

1 回答 1

-1

胜利!

似乎至少有两个人比我对 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 使用的版本)。

回去工作。

于 2013-10-03T07:18:09.440 回答