如何确定在Google App Engine运行时(Java)上运行的某些代码(Serv-LET还是简单类)是否可以决定是否使用App Engine的特定库?是否有一些可靠的运行时环境ID?

没有正确的解决方案

其他提示

您可以检查 com.google.appengine.runtime.version 财产:

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

如果是设置的,则是应用引擎。

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

类似于@reza写的东西,但有点清洁:

采用 SystemProperty.environment.value() 要得到 ”生产“在应用程序引擎上运行时”发展“在开发服务器中运行时。

正如@matthew Flaschen所说,您可以检查一些系统属性,以确定GAE是否存在。 这个链接 提供细节。

如果您走这条路线,则需要构建您的应用程序,以使主代码对GAE类没有静态依赖性;即没有导入或其他对代码中GAE软件包和类的引用(与字符串文字中的GAE类名相隔)。所有依赖项都必须隔离到使用的代码 Class.forName(String) 确定是否存在GAE之后。

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

  • 您可能最终会获得一个额外的适配器接口,并且(至少)为GAE和非GAE案例进行了两个实现。
  • 您已经有(次要的)运行时开销,可以在启动时动态加载相关类,并通过适配器接口进行呼叫。
  • 因此,您的罐子文件更大。
  • 现在,您必须在两个平台上进行测试。

另一方面,您确实具有在GAE和非GAE环境中使用一个罐子的潜在优势。

如解释 这里 您可以检查以下属性:

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

environment 在开发服务器中运行时,在应用程序引擎上运行时是“生产”。

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

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

还有另一种方法可以做到这一点。这在GAEVFS的文档中很好地解释了如何编写便携式代码: http://code.google.com/p/gaevfs/wiki/applicationportability

您感兴趣的是以下行:

boolean isGoogleAppEngine = getServletContext().getServerInfo().contains( "Google" );
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top