我们有一个项目取决于Aspose Words的com.aspose:aspose-words:16.10.0:jdk16
。如何解决Maven/Gradle中几个级别间接缺失的依赖项地狱?
POM为aspose-words
声明没有依赖关系,但事实证明这是一个谎言。它实际上使用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插件来失败构建...但每个库都由其团队维护..如果他们拒绝修复事情,然后把它叉起来并自己修复是最好的选择。这确实意味着你必须以常规的方式将原创新增加的内容合并到你自己的分支中。但是,如果它已经死了......不会有任何东西。但Aspose不是我认为的开源软件?所以可能会有许可问题。另一种解决方案是:创建一个包装器POM,依赖于Aspose和它需要的每个库,然后依赖这个包装器POM。 – Tunaki
请阅读[Aspose.Words附加依赖关系](https://docs.aspose.com/display/wordsjava/System+Requirements#SystemRequirements-AdditionalDependencies)。你能分享你的用例的完整细节吗?然后我会为您提供有关您的查询的更多信息。我与开发者传道者一起工作。 –
@TahirManzoor在这种特殊情况下,我们使用Aspose将DOC转换为PDF。一个DOC碰巧包含BMP,由于某种原因,Aspose使用JAI来读取BMP。这似乎是一个遗留问题,因为我无法获得Word的现代版本来创建此类文档,所以我正在等待有关哪个版本的Word创建它的更多信息,以便我可以挖掘该版本的VM并尝试制作测试文件。 – Trejkaz