2010-11-10 86 views
7

如何确定某些代码(serv-let或简单类)是否在Google App Engine运行时(Java)上运行,以便人们可以决定是否利用应用程序引擎的特定库或不?有没有一些可靠的运行环境ID?确定应用程序引擎运行时(Java)上是否运行代码

+0

的可能的复制[如何在Java应用程序引擎检查,如果我们开发工作站上(http://stackoverflow.com/问题/ 1574637 /如何在java-app-engine-in-check-in-java-app-engine-if-we-are-development-workstation) – 2016-05-09 01:28:25

回答

4

您可以检查com.google.appengine.runtime.version属性:如果设置

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

,它的App Engine。

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

+1

非常感谢你的回答。对于这两种情况,我有两个独立的实现子类,并且它们非常小(两行代码总共200行)需要单独构建。 – nsegae 2010-11-10 02:57:51

1

正如@Matthew Flaschen所说,您可以检查系统属性以确定GAE是否存在。 This link给出了细节。

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

这代表了不平凡的开销:

  • 你可能有一个额外的适配器接口落得和(至少)两种实现了GAE和非GAE的情况。
  • 您已经在启动时动态加载相关类并通过Adapter接口调用了(较小)运行时开销。
  • 您的JAR文件的结果要大得多。
  • 您现在必须在两个平台上进行测试。

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

1

正如所解释的here您可以检查以下属性:

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

environment在App Engine上运行时为“生产”,在开发服务器上运行时为“开发”。

2

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

使用SystemProperty.environment.value()得到“生产”在App Engine,而“发展”运行时,在开发服务器中运行时。

1

我看不出有什么类型安全的解决方案在这里所以在这里,它是:

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