确定代码是否在app引擎运行时运行(Java)

时间:2010-11-10 02:37:19

标签: java google-app-engine

如何识别某些代码(serv-let或简单类)是否在Google App Engine运行时(Java)上运行,以便可以决定是否使用应用引擎的特定库?那是否有一些可靠的运行时环境ID?

6 个答案:

答案 0 :(得分:4)

您可以查看com.google.appengine.runtime.version属性:

String appEngineVersion = System.getProperty("com.google.appengine.runtime.version");

如果已设置,则为App Engine。

但我会考虑使用单独的构建目标,以避免运行时开销。

答案 1 :(得分:2)

类似于@Reza写的,但有点清洁:

在App Engine上运行时使用SystemProperty.environment.value()获取“生产”,在开发服务器中运行时使用“开发”。

答案 2 :(得分:1)

正如@Matthew Flaschen所说,您可以检查系统属性以确定GAE是否存在。 This link提供了详细信息。

如果沿着这条路走下去,你的应用程序需要构建,以便主代码对GAE类没有静态依赖;即代码中没有对GAE包和类的导入或其他引用(在字符串文字中除了GAE类名等)。在您确定GAE是否存在之后,必须将所有依赖关系与使用Class.forName(String)加载的代码隔离开来。

这代表了一个非平凡的开销:

  • 您最终可能会获得额外的适配器接口和(至少)GAE和非GAE案例的两种实现。
  • 你有(次要)运行时开销,在启动时动态加载相关类,并通过Adapter接口调用。
  • 您的JAR文件因此大得多。
  • 您现在必须在两个平台上进行测试。

另一方面,你确实有一个可以在GAE和非GAE环境下工作的JAR的潜在优势。

答案 3 :(得分:1)

正如here所述,您可以查看以下属性:

String environment = System.getProperty(
    "com.google.appengine.runtime.environment")

environment在App Engine上运行时为“Production”,在开发服务器中运行时为“Development”。

答案 4 :(得分:1)

我在这里看不到任何类型安全的解决方案,所以这里是:

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
    // The app is running on App Engine...
}

答案 5 :(得分:0)

还有另一种方法可以做到这一点。这在gaevfs关于如何编写可移植代码的文档中得到了很好的解释:http://code.google.com/p/gaevfs/wiki/ApplicationPortability

您感兴趣的是以下一行:

boolean isGoogleAppEngine = getServletContext().getServerInfo().contains( "Google" );