我最近在我从事的一些项目中从 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 类。
最后,我的问题是:
- HK2为什么要重新包装所有东西?这有什么好的理由吗?
- HK2实际上重新包装了什么,我可以只使用标准的API版本吗?我将如何解决这个问题?我已经克隆了 HK2 项目,但我在弄清楚从哪里开始找到它时遇到了一些麻烦。
除了这些问题的实际答案之外,联系 HK2 背后的开发人员以便我可以直接提问的好论坛是什么?我浏览了该网站,虽然我找到了一些邮件列表,但我没有看到任何明显适合问这个问题的东西。