Mar*_*eon 6 java build-process configuration-management
我确定这是一个愚蠢的问题,但是..我们有相同的Java源文件,我们想要使用不同版本的Java API(jar文件),具体取决于我们构建应用程序的客户端.
较新版本的API具有我们在Java源代码中引用的方法setAAA()和setBBB():
if (...) {
api.setAAA(a);
api.setBBB(b);
}
Run Code Online (Sandbox Code Playgroud)
如果使用旧API编译,旧代码API没有这些setter,则此代码将失败.如果我们使用新的API,有没有办法条件化此代码只编译setter行?
谢谢.
最安全的方法是回退到您需要支持的最低版本.这假设所有版本都向后兼容,但不一定如此.
如果该解决方案不合适或不合适,那么我将回归依赖注入.在Spring框架是目前最流行和最常见的DI框架,但绝不是唯一的一个.Guice是另一个.如果不希望为此添加完整的框架,您甚至可以自己动手.
但我设想一个Java应用程序 - 特别是Web/J2EE应用程序 - 我没有使用Spring就会遇到问题.这太有用了.
假设有4个版本的相关jar.API在此期间已更改两次,因此您有3种不同的API版本.您需要将该jar的使用抽象为您自己的API,这些API在所有这些版本中都是一致的,然后创建它的三个实现:每个不同的API版本一个.
在Spring中,您创建了一个应用程序上下文,它定义了所有bean以及它们如何注入其他bean.没有理由不能选择或构建应用程序上下文作为构建过程的一部分.通常使用属性,但您也可以通过这种方式包含部分应用程序上下文.
这里的关键点是,尽管API不同,但就代码而言,您需要抽象出这些差异.如果你不这样做,你只是在寻找麻烦而且它变得更加混乱.
Java 确实不适合这种条件编译(与 C++ 不同),而且老实说,它听起来像是最终陷入“类路径地狱”的秘诀。
虽然您可以手动开始处理返回 API 版本的函数,但您随后会得到一个适合特定版本的类文件,但没有迹象表明它可能不兼容。
我以前遇到过这种情况(例如,使用不同版本的 Eclipse),而且情况不太好。我最终做的是拥有一个具有两种不同实现的接口,每个 API 一个,将它们中的每一个放在一个单独的项目中(在我的例子中是一个插件),然后尝试使用工厂或注入来加载它们。尽可能隔离它们。
| 归档时间: |
|
| 查看次数: |
2151 次 |
| 最近记录: |