【发布时间】:2017-07-20 01:51:45
【问题描述】:
我们有一个项目依赖于 Aspose Words 的com.aspose:aspose-words:16.10.0:jdk16。
aspose-words 的 POM 声明没有依赖关系,但事实证明这是一个谎言。它实际上使用jai-core,最新版本在javax.media:jai-core:1.1.3。
不过,jai-core 的 POM 也存在问题 - 它声明没有依赖关系,但实际上依赖于 jai-codec,它位于 com.sun.media:jai-codec:1.1.3。
让这些项目来解决问题似乎不切实际。 JAI 基本上是一个死项目,Maven Central 不知道是谁添加了 POM,因此没有人负责修复元数据。 Aspose 拒绝在没有测试重现的情况下修复问题,即使您可以向他们展示他们自己的代码做错了,即使他们修复了它,他们也会添加对 jai-core:1.1.3 的依赖,这无论如何只能解决一半的问题。
如果我查看整个依赖关系树,这只是问题的一个示例。其他人正在潜伏,被其他依赖链掩盖,巧合地拉动了缺失的依赖。在某些情况下,我们甚至向项目报告了 POM 问题,只是让他们说依赖“不是真实的”,尽管他们的类明确引用了另一个库中的类。
我能想到几个同样尴尬的选择:
- 创建
jai-core:1.1.3.1和aspose-words:16.10.0.1并修复它们的POM 以包含缺少的依赖项,但是将来更新它们的人都必须做同样的事情。另外,我不知道哪个恰好依赖于jai-core的任何其他库也必须更新。 - 从我们自己的项目中添加一个依赖项,即使它确实不是一个。
- 为现在存在的版本编辑 POM 以直接解决问题,唯一需要注意的是人们可能缓存了错误的版本。
所以我想我有两个相关的问题:
- 没有适当的方法可以解决这个问题吗?似乎任何非玩具项目最终都会遇到这个问题,因此没有明显正确的方法来处理它令人担忧。
- 有没有办法阻止不正确的依赖元数据首先进入工件服务器?这有点失控了,因为团队中的其他开发人员正在添加依赖项而没有正确检查事情,然后当一年后出现问题时,我不得不清理他们的错误。
【问题讨论】:
-
如果使用了特定的依赖项,您可以使用 Enforcer 插件使构建失败……但每个库都由其团队维护。如果他们拒绝修复,那么 fork 并自己修复是要走的路。这确实意味着您必须定期将新添加的原始内容合并到您自己的分叉中。但如果它无论如何都死了……就不会有任何东西了。但是我认为 Aspose 不是开源的?所以无论如何都可能存在许可问题。另一种解决方案:创建一个包装器 POM,依赖于 Aspose 及其所需的每个库,然后依赖于这个包装器 POM。
-
请阅读additional dependencies of Aspose.Words。您能否分享您的用例的完整细节?然后,我将为您提供有关您的查询的更多信息。我与 Aspose 合作,担任开发人员宣传员。
-
@TahirManzoor 在这种特殊情况下,我们使用 Aspose 将 DOC 转换为 PDF。一个 DOC 碰巧包含一个 BMP,出于某种原因,Aspose 使用 JAI 来读取 BMP。这似乎是一个遗留问题,因为我无法获得现代版本的 Word 来创建此类文档,所以我正在等待有关哪个 Word 版本创建它的更多信息,以便我可以使用该版本挖掘 VM并尝试制作一个测试文件。
标签: java maven jai aspose.words build-dependencies