什么是autovalue.shaded或什么是shaded jar?

3

我正在寻找一种将字符串解析为整数的方法,并偶然发现:

NumberUtils.toInt("blah",99);

我在我的集成开发环境中输入了这个,它自动为我导入了这个:

import autovalue.shaded.org.apache.commons.lang.math.NumberUtils;

我很好奇知道 autovalue.shaded 是什么,为什么它要“遮蔽”org.apache.commons?同时,使用它来满足我的NumberUtils需求是安全的吗?
我尝试搜索,但不熟悉搜索结果中提到的假定知识,如 shaded jar 和 uber jar。

enter image description here

1个回答

1
"Shading" 是将依赖类嵌入到您自己的 jar 文件中的过程。AutoValue 这样做部分是为了限制短暂依赖,但也是为了确保其依赖项的版本稳定性。
您可以在这里阅读更多关于 Shading 的信息: https://maven.apache.org/plugins/maven-shade-plugin/ 我强烈建议您不要在代码中使用 shaded 依赖项,因为这意味着您不再控制依赖项的版本。您可以直接添加依赖项,以便控制其更新时间。
您还可以检查您的 gradle 依赖项,确保您的 compile 目标中没有 AutoValue。我从您的其他依赖项中看到这是一个 Android 项目,如果 AutoValue 在 compile 目标上,则 APK 将比您想要的要大得多。它应该通过 apt 在注释处理器类路径中包含,以便其类不包含在最终产品中。Hugo Visser 有一个很好的 gradle 插件,可以为 Android 项目启用 apt 目标。

谢谢,这有些讲得通。我没有使用过 apt,但我正在使用 Proguard,那样做是否可以达到同样的效果 - 防止不良的 JAR 包出现在最终的 APK 中? - Mendhak
1
Proguard可能会做一些工作,但那不是真正的解决方案。它增加了更多的复杂性和挑战(调试,调试构建复杂性)来解决一个简单地包含一个不应该存在的依赖项的问题。这有点像将浓缩咖啡或其他测试库放在编译范围内,然后使用proguard将其删除。正确的解决方案是将它放在它应该去的地方。Hugo的android-apt插件只需要两行新代码(每个build.grade文件中各一行),大功告成。 - rharter
感谢您的解释。 - Mendhak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接