2017-02-28 93 views
3

我们有一个项目取决于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.1aspose-words:16.10.0.1,并解决他们的POM包括缺少的相关性,但谁在未来的更新他们会做同样的事情。另外,任何其他库我不知道哪些恰好取决于jai-core也必须更新。
  • 从我们自己的项目中添加依赖项,尽管它确实不是一个项目。
  • 编辑现在有的版本的POM直接解决问题,只是告诫人们可能缓存了错误的版本。

所以我想我有这个两个相关的问题:

  • 是否有解决这个不正确方式?看起来任何非玩具项目最终都会遇到这个问题,所以没有一个明显正确的方法来解决这个问题令人担忧。
  • 有没有办法阻止不正确的依赖关系元数据进入工件服务器?因为团队中的其他开发人员正在添加依赖关系而没有正确检查事情,因此当一年后发生一些事情时,我会留下来清理它们的错误。
+2

如果使用特定的依赖关系,您可以使用Enforcer插件来失败构建...但每个库都由其团队维护..如果他们拒绝修复事情,然后把它叉起来并自己修复是最好的选择。这确实意味着你必须以常规的方式将原创新增加的内容合并到你自己的分支中。但是,如果它已经死了......不会有任何东西。但Aspose不是我认为的开源软件?所以可能会有许可问题。另一种解决方案是:创建一个包装器POM,依赖于Aspose和它需要的每个库,然后依赖这个包装器POM。 – Tunaki

+0

请阅读[Aspose.Words附加依赖关系](https://docs.aspose.com/display/wordsjava/System+Requirements#SystemRequirements-AdditionalDependencies)。你能分享你的用例的完整细节吗?然后我会为您提供有关您的查询的更多信息。我与开发者传道者一起工作。 –

+0

@TahirManzoor在这种特殊情况下,我们使用Aspose将DOC转换为PDF。一个DOC碰巧包含BMP,由于某种原因,Aspose使用JAI来读取BMP。这似乎是一个遗留问题,因为我无法获得Word的现代版本来创建此类文档,所以我正在等待有关哪个版本的Word创建它的更多信息,以便我可以挖掘该版本的VM并尝试制作测试文件。 – Trejkaz

回答

1

Tunaki已经给出了很多好的方法。让我补充以下内容:

我们不得不处理很多传统的罐子,这些罐子是MavenCentral上已有的罐子的一些旧的或奇怪的版本。我们给了他们一个特殊的版本号(如1.2.3-companyname),并为他们创建了符合我们目的的POM。这是 - 或多或少 - 你的第一个“尴尬选择”。这就是我想为你处理的事情;此外,我会在dependencyManagement中定义版本,以便Maven依赖关系调解不会将其设置为其他版本。

如果你的jar的新版本出现了,你可以检查它是否仍然存在相同的问题(如果他们做了正确的Maven构建,他们应该拥有POM内的所有依赖关系)。如果是这样,你需要再次修复它。

我不会更改已有版本的poms,因为它会让人感到困惑,并且可能会导致不一致性问题,因为如果旧版本已经存在于本地存储库中,Maven将无法获取新的POM。如果只有很少的项目需要管理,以便您仍然可以看到正在发生的事情(对POM中的依赖关系进行适当评论可以使其更清晰),那么将依赖项添加到您自己的项目中是一种选择。

-1

JAI对于Aspose.Words for Java是可选的。 Aspose.Words for Java只有在可用时才使用JAI图像编码器和解码器。如果没有JAI,它就可以正常工作。

该编解码器补充了标准的java ImageIO编码器/解码器。最显着的补充是Tiff的支持。

JAI(Java Advanced Imaging)不是通常的库。首先 - 它是本地图书馆。即它为不同的平台分配分配。它也具有“便携式”纯Java分发功能,但如果您想要JAI的全部功能 - 您应该坚持原生选项。

另一件事:通常你应该在主机系统上运行JAI本地分布式安装。即它像桌面应用程序一样安装,不像通常的java库。同样,JAI编解码器的行为不像通常的库:如果它安装在系统上 - 它将插入ImageIO,与类路径无关。

所以,我不知道使用Maven安装JAI的好方法 - 就像使用Maven安装Skype或任何其他桌面应用程序一样。但它是恕我直言,我不是Maven的伟大专家:)

+0

在这种特殊情况下,它使用JAI来读取BMP,因为文档碰巧包含一个。如果您没有JAI,则尝试将这样的文档保存为PDF时会失败。所以“它会工作正常”有点让人误解......如果你碰巧遇到一个带有BMP的文档,它只会起作用。而且您无法预先知道您收到的文件是否会触发该问题。 – Trejkaz

+0

它是否插入“红十字”图像而不是不支持/破碎的图像?如果是 - 没关系。无论如何,你最好在Aspose.Words支持论坛https://www.aspose.com/community/forums/aspose.words-product-family/75/showforum.aspx上提出你的问题。可能是你的系统可以加载你的类型的BMP没有JAI - 在这种情况下,它是一个错误。 –

+0

它根本不会生成PDF,因为你失败了。我们已经在论坛上发帖了,但他们要求提供一个样本。没有人会给我们一个样本,Aspose本身也不能用于创建一个带有BMP的文档,因为它们会自动将其转换为PNG。 – Trejkaz