1

我有一个在嵌入式设备上运行的 Java 应用程序。因为不同的设备运行不同版本的设备 SDK,我必须针对大约 5 种不同的设备 SDK 组合进行构建。

其中一种组合不支持现有对象的特定方法,并完全从 SDK 中省略了另一个对象。

我在我的程序中使用此方法和对象,但仅在特定配置中使用,因此我想在不支持它的设备上回退到另一种配置。

我很乐意在编译或运行时执行此回退行为。

有条件地删除此代码的最简单方法是什么?

代码在其他方面是相同的,所以我不希望为两个 SDK 创建两个单独的代码分支。

我使用 Ant 脚本构建我的应用程序。

如果相关的话,我的应用程序必须针对一个相当旧版本的 JDK (1.1.8/1.2) 构建。

4

2 回答 2

2

一个想法是创建两个具有相同接口的类,一个完整实现和一个存根,两者都具有 isSupported() 方法,并且存根中的所有其他方法都会抛出 UnsupportedOperationException。然后我可以在编译期间有条件地在我的 Ant 脚本中包含正确的类。

我选择使用这种方法而不是更动态的方法@Stephen C,因为它非常适合我们的目的,而且我们对设备(包括设备文件系统)的访问非常有限,因此很难部署多个 jars,设置类路径,等等

我最终做的是如下:

  1. 将需要存根的类移动到单独的包中。
  2. 创建一个新目录mypackagenamestub并将要存根的文件复制到其中。确保您的 IDE 不会更改要存根的文件的包声明。
  3. 我们已经在 Ant 脚本中根据构建应用程序的 SDK 设置了 SDK 路径属性,因此我添加了另一个属性omit.unsupportedmode(释义)并在适当的地方将其设置为 true。
  4. 使用条件任务设置一个值以传递给 的 excludes 属性javac,例如**/MyPackageStub/****/MyPackage/**基于omit.unsupportedmode
于 2010-11-12T00:25:44.640 回答
2

@Lawrence Johnston 的自我回答概述了如何在构建时执行此操作。我认为这基本上是正确的想法,但您可能不希望插件 API 抛出检查异常。理想情况下,您希望旧平台的实现“尽最大努力”尝试执行请求的功能。

如果您想在运行时做出决定,您可以:

  • 将类的不同版本放入单独的 JAR 文件中,并使用包装脚本在应用程序类路径中包含适当的 JAR。

  • 用于Class.forName()动态加载适合平台的类版本。

无论哪种情况,您都需要确保基础应用程序类(旨在在所有平台上工作)不会静态依赖于任何更高级的 SDK/JDK。

最后,我倾向于不支持 Java 的古老版本。许多年前,它们已“报废”,支持它们的要求显然使您望而却步。例如,核心应用程序对向后兼容性的要求意味着它不能利用最近 Java 版本中添加的许多新特性。您有多少客户仍在使用那些古老的 Java 版本?为什么他们不能升级他们的平台?他们真的需要您的应用程序的最新版本吗?

于 2010-11-12T00:52:07.830 回答