17

我最近在我从事的一些项目中从 Jersey 1 切换到 Jersey 2。我在 Jersey 2 中遇到的最大烦恼是它使用了 HK2,它出于某种原因重新打包了标准的 Maven 工件。为了避免潜在的令人讨厌的调试问题,我尽量避免从不同的项目中引入相同的类。如果发生这种情况,我使用 Extra Enforcer Rules 依赖项中的Ban Duplicate Classes Maven 执行器规则来中断构建。

根据前面提到的 Ban Duplicate Classes 强制执行规则,切换到 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 依赖项,例如验证 API。其次,我的工件现在正在导出 HK2 重新打包的依赖项,而不是我希望导出的实际 API 类。

最后,我的问题是:

  1. HK2为什么要重新包装所有东西?这有什么好的理由吗?
  2. HK2实际上重新包装了什么,我可以只使用标准的API版本吗?我将如何解决这个问题?我已经克隆了 HK2 项目,但我在弄清楚从哪里开始找到它时遇到了一些麻烦。

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

4

1 回答 1

13

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

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

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

于 2014-08-09T11:46:41.150 回答