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

在与另一家也使用 App Engine 的公司的同事进行了一番讨论后,他告诉我,他通过以下步骤将应用预热时间从大约 15 秒缩短到大约 5 秒:

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

他认为,在实例预热期间,由于实例只需要加载单个捆绑的JAR文件,而不是数千个单独的类,因此预热速度会快得多。对此有什么想法或意见吗?

我当然想自己尝试一下,但我没有足够的Eclipse-mojo来知道如何配置这些步骤。有没有人知道如何配置Eclipse或Google Plugin for Eclipse来执行上述步骤?(当然,还可以让部署的应用程序在 App Engine 中成功运行)

谢谢


答案 1

我们在Eclipse中所做的是:

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

您可以将 jar 生成器配置为在类文件更改时自动执行(通常随着源文件更改而自动重新编译)。

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


答案 2

我不知道如何(或者是否)将它集成到日食中,但是与蚂蚁有关是相当微不足道的:

<import file="${appengine.sdk.dir}/config/user/ant-macros.xml" />

<target name="deploy">
    <delete dir="${staging.dir}" />
    <mkdir dir="${staging.dir}" />

    <copy todir="${staging.dir}">
        <fileset dir="war">
            <exclude name="WEB-INF/classes/**" />
            <exclude name="WEB-INF/appengine-generated/**" />
        </fileset>
    </copy>
    <jar destfile="${staging.dir}/WEB-INF/lib/classes.jar" basedir="${classes.dir}" />

    <appcfg action="update" war="${staging.dir}" />
</target>

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

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

我发现,它不是从20到45秒的大幅变化,而是使我的应用程序在20秒内持续加载。它后来没有保持这种一致性,但我现在仍然将我的类作为部署的标准部分。


推荐