为什么HK2要重新包装所有东西?

我最近从泽西岛1号切换到泽西岛2号,用于我从事的一些项目。我在泽西岛2中遇到的最大烦恼是它使用了HK2,由于某种原因,它重新包装了标准的Maven工件。为了避免潜在的烦人的调试问题,我尽量避免从不同的项目中提取相同的类。如果发生这种情况,我使用“额外执行者规则”依赖项中的“禁止重复类 Maven 执行器”规则来中断生成。

根据前面提到的“禁止重复类”执行器规则,切换到 Jersey 2 在其工件与我以前使用的标准工件之间引入了以下冲突:

hk2 Artifact                                                Conflicting Artifact
org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b07 aopalliance:aopalliance:1.0
org.glassfish.hk2.external:bean-validator:2.3.0-b07         com.fasterxml:classmate:0.8.0 (used by org.hibernate:hibernate-validator:5.0.0.Final)
org.glassfish.hk2.external:bean-validator:2.3.0-b07         javax.validation:validation-api:1.1.0.Final
org.glassfish.hk2.external:bean-validator:2.3.0-b07         org.hibernate:hibernate-validator:5.0.0.Final
org.glassfish.hk2.external:bean-validator:2.3.0-b07         org.jboss.logging:jboss-logging:3.1.0.GA
org.glassfish.hk2.external:javax.inject:2.3.0-b07           javax.inject:javax.inject:1

我的解决方案是从传递它们拉取它们的依赖项中排除标准工件,因此仅使用 hk2 工件。我认为这更安全:我不知道hk2工件还拉入了什么,如果我排除它们,我可能会丢失(例如,bean-validator工件似乎正在重新打包至少四个工件)。这样做的缺点是,首先,我有大量的排除,充斥着我的依赖项,这些依赖项引入了其他无害的API依赖项,例如verition-api。其次,我的工件现在正在导出HK2重新打包的依赖项,而不是我想要导出的实际API类。

最终,我的问题是:

  1. 为什么HK2要重新包装所有东西?这有什么好的理由吗?
  2. HK2 实际上什么是重新打包,我可以只使用标准 API 版本吗?我怎么知道呢?我已经克隆了HK2项目,我有点难以弄清楚从哪里开始发现这个问题。

除了这些问题的实际答案之外,有什么好论坛可以联系HK2背后的开发人员,这样我就可以直接提出问题了?我已经浏览了网站,虽然我发现了一些邮件列表,但我没有看到任何明显适合问这个问题的东西。


答案 1

HK2在OSGi环境中运行,适用于GlassFish等产品。不幸的是,大多数标准jar,如javax.inject,bean-validator和aopalliance都没有正确的OSGi标头。因此,hk2 需要用 OSGi 标头重新打包它们,以便它们在该环境中正常工作。

此外,由于GlassFish是Java EE的RI,因此对源代码的可用性有一定的法律要求,因此所做的一些重新打包是为了满足源代码的可用性要求。

话虽如此,如果您不在OSGi环境中运行,则可以安全地将这些jar替换为标准版本(尽管我自己没有尝试过)


答案 2

推荐