配置Eclipse以将App Engine类预先捆绑到单个JAR中,以便更快地进行预热

在与另一家同时使用App Engine的公司的同事讨论后,他告诉我,他设法使用以下步骤将应用程序预热时间从约15秒减少到约5秒:

  1. 配置Eclipse以将编译期间生成的类捆绑到单个JAR文件中。
  2. 在App Engine部署期间,将Eclipse配置为上载此单个JAR文件,而不是上载数百(或数千)个单独的Java类。

他认为,在实例热身期间,由于实例只需要加载一个捆绑的JAR文件而不是数千个单独的类,因此预热会明显加快。 对此有何想法或意见?

我肯定想亲自尝试一下,但我没有足够的Eclipse-mojo知道如何配置这些步骤。 有谁知道如何配置Eclipse或Eclipse的Google插件来执行上述步骤? (当然,已部署的应用程序在App Engine中成功运行)

谢谢,

如前面的答案中所述,App Engine SDK支持将WEB-INF/classes打包到jar文件中,该文件最终将放在WEB-INF/lib/_ah_webinf_classes-0000.jar 。 你可以激活它

  1. 使用带有选项--enable_jar_classes的appcfg工具。

  2. 通过配置WAR或EAR项目的属性来使用Google Plugin for Eclipse:项目属性> Google App Engine>部署>“将WEB-INF / classes打包为jar”

对我来说,在App Engine 1.9.4上,这导致实例旋转只有轻微的改进(大约5-10%,如果有的话)。


请注意,这将打包WEB-INF / classes中的所有文件(不仅仅是.class文件)。 在更改之后,我在实例化期间收到一条错误消息,指出无法再读取logging.properties文件; 可能是因为当时没有读取新的jar文件:

Unable to read the java.util.logging configuration file, WEB-INF/classes/logging.properties

作为解决方法,我将appengine-web.xml中的路径更改为WEB-INF/logging.properties并配置maven-war-plugin将文件复制到该位置:

    lib WEB-INF/lib    src/main/resources  logging.properties  WEB-INF   

我们在Eclipse中所做的是:

  • 在项目属性> Java构建路径(源选项卡)中将输出文件夹从war / WEB-INF / classes更改为其他内容,例如bin(我相信Eclipse曾抱怨过这一次)
  • 在Project Properties> Builders中添加一个新构建器(我使用类型“program builder”并将其指向我JDK中的jar可执行文件,但正如其他人提到的那样,Ant构建器也可以工作)。 显然,您应该将此构建器配置为从您决定将类文件编写到的任何位置获取其输入,并输出到war / WEB-INF / lib / myclasses.jar之类的内容

您可以将jar构建器配置为在类文件更改时自动执行(这反过来通常会在源文件更改时自动重新编译)。

但是有一些缺点。 出于某种原因,谷歌eclipse插件因更改java编译器的输出目录而感到困惑。 这意味着在部署时你必须手动指向war目录,我相信你必须手动将一些GAE jar复制到war / WEB-INF / lib文件夹中。

我不知道你是如何(或者如果)将它集成到eclipse中的,但是对于ant来说它是相当简单的:

              

我将补充说,我没有经历应用程序启动时间减少3倍。 我在这个post中发布了一些实验数字:

https://groups.google.com/d/msg/google-appengine/dStBW4wIemY/K69f9ufDiN0J

我发现它不是在20-45秒之间疯狂变化,而是让我的应用程序在20秒内持续加载。 它后来一直没有保持这种一致性,但我现在还把我的课程作为部署的标准部分。

如果通过Ant进行部署,可以实现这一目标,如下所述: https : //developers.google.com/appengine/docs/java/tools/ant

接下来,您可以修改ant build.xml文件以调用ant命令来构建jar文件。 在实际部署之前,您可以删除或移动已编译的工件。 构建jar文件应放在WAR / WEB-INF / lib文件夹中。

这个解决方案的缺点是你必须通过appengine eclipse插件通过build.xml,iso进行部署。

请注意,从版本1.7.4开始:

您现在可以将所有WEB-INF / classes / *类打包到jar文件中。 这可以通过新的来完成

appcfg工具中的--enable_jar_classes选项。 默认情况下,未设置此选项。

http://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes

我认为最简单的方法是创建一个单独的项目,您可以编写所有代码以及存储任何其他依赖项。 当您准备好部署时,Eclipse导出到可运行的JAR文件可以将所有依赖项和您的类重新打包到一个JAR文件中,然后您可以将其用作可部署的Google App Engine项目中的一个依赖项,该项目基本上由任何项目组成。 WEB-INF文件夹中的配置文件以及其他静态资源+一个大的JAR文件。

除了eclipse导出之外,您可以将其设置为Maven或Ant构建,也可以进行重新打包。

他认为在实例预热期间,由于实例只需要加载一个捆绑的WAR文件而不是数千个单独的类,因此预热会明显加快。 对此有何想法或意见?

我对此表示怀疑。 WAR只是一个ZIP文件,当它部署在服务器上时会解压缩。 所以还有一个额外的步骤,这意味着该过程可以同样快速(如果在上载时解压缩)或更慢(如果在实例旋转时解压缩)。