根据 HHH-2412 及其 设计讨论,我一直致力于在 Hibernate 中支持 JDBC4。最初我计划在 3.6 版本中添加这项功能,但现在倾向于 3.5 版本。无论如何,正如设计维基中所概述的,最初我打算将其支持作为单独的模块添加。然而,我很快意识到,使用单独的模块实际上需要用户显式选择一个 额外的
jar。考虑到我可以使 Hibernate 代码通过程序来判断这一点,我真的不喜欢在这里使用模块的这一方面。因此,我开始寻找替代方案。
像往常一样,我开始考虑在没有任何构建结构或工具的情况下理想的方案。因此,在我看来,这里最好的选择似乎是编译针对 JDK 1.6 的 JDBC4 支持和针对 JDK 1.4 的 JDBC3 支持,然后将所有这些代码打包成一个单独的 jar。决定使用哪个功能集的代码实际上已经使用了反射,因此只要正确加载了类(而其他任何东西都会是这个判断代码中的错误),将两者放在同一个 jar 中就没有问题。
不幸的是,Maven 并不支持这样的设置。在常见情况下,我认为你会在主模块中设置多个源目录,并针对它们运行不同的编译执行,使用不同的编译器设置(源/目标)。Maven 明确禁止这样做(见 MCOMPILER-91 和 其讨论 以获取详细信息)。
提出了两种 可行的
解决方案
- 使用单个源目录,但配置两个编译插件的执行,利用 includes/excludes 定义针对 1.6 和 1.4 的编译目标。这里的问题是,这并不适合 IDE。
- 将此内容分为3个模块(每个模块分别用于JDB3和JDBC4的支持,还有一个用于
通用性
以避免与核心模块形成循环依赖)。核心模块随后将从这三个模块中提取编译后的类到其jar文件中。对我来说,这只是为了解决Maven自设的限制而显得过于复杂。而且,对于那个Maven讨论中提到的这构成了一个混乱的系统
,我实在看不出其中的道理。
无论如何,我真的希望有人能提出其他更好的方法来处理这个问题。有人吗?