Java 将Eclipse配置为将应用程序引擎类预绑定到单个JAR中,以加快预热
在与另一家同样使用App Engine的公司的同事讨论后,他告诉我,他通过以下步骤将应用程序预热时间从~15秒缩短到~5秒:Java 将Eclipse配置为将应用程序引擎类预绑定到单个JAR中,以加快预热,java,eclipse,google-app-engine,deployment,jar,Java,Eclipse,Google App Engine,Deployment,Jar,在与另一家同样使用App Engine的公司的同事讨论后,他告诉我,他通过以下步骤将应用程序预热时间从~15秒缩短到~5秒: 将Eclipse配置为将编译期间生成的类捆绑到单个JAR文件中 配置Eclipse以在应用程序引擎部署期间上载这个JAR文件,而不是数百(或数千)个单独的Java类 他认为,在实例预热期间,由于实例只需要加载一个绑定的JAR文件,而不需要加载数千个单独的类,因此预热速度会明显加快。对此有什么想法或意见吗 我当然想自己尝试一下,但我没有足够的EclipseMojo来知道如何
我对此表示怀疑。WAR只是一个ZIP文件,当它部署到服务器上时会被解压。因此还有一个额外的步骤,这意味着这个过程可以同样快(如果上传时解包),也可以慢(如果实例启动时解包)。我认为最简单的方法是有一个单独的项目,在其中编写所有代码并存储任何其他依赖项。当您准备部署时,Eclipse导出到可运行JAR文件可以将所有依赖项和类重新打包到单个JAR文件中,然后在可部署的GoogleAppEngine项目中将其用作一个依赖项,该项目基本上由WEB-INF文件夹中的任何配置文件以及其他静态资源+一个大JAR文件组成 除了eclipse导出之外,您还可以将其设置为Maven或Ant构建,也可以进行重新打包。我不知道如何(或是否)将其集成到eclipse中,但是使用Ant非常简单:
<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>
我发现我的应用程序并没有在20-45秒之间有很大的变化,而是在20秒内持续加载。它后来并没有保持这种一致性,但我现在仍然将jar类作为部署的标准部分。我们在Eclipse中所做的是:
- 在projectproperties>Java构建路径(Source选项卡)中,将输出文件夹从war/WEB-INF/classes更改为其他文件夹,例如bin(我相信Eclipse曾经抱怨过这一点)
- 在projectproperties>Builders中添加一个新的构建器(我使用了类型“programmbuilder”并将其指向JDK中的jar可执行文件,但正如其他人提到的那样,Ant构建器也可以工作)。显然,您应该将这个构建器配置为从您决定将类文件写入的任何地方获取其输入,并输出到war/WEB-INF/lib/myclasses.jar之类的东西
您可以将jar构建器配置为在类文件更改时自动执行(这些文件通常会在源文件更改时自动重新编译)
不过,也有一些不利因素。由于某些原因,更改java编译器的输出目录会使GoogleEclipse插件感到困惑。这意味着您在部署时必须手动指向war目录,我相信您必须手动将一些GAE JAR复制到war/WEB-INF/lib文件夹中。如果通过Ant进行部署,可以实现这一点,如中所述:
接下来,您可以修改ant build.xml文件以调用ant命令来构建jar文件。在实际部署之前,您可以删除或移开已编译的工件。构建jar文件应该放在WAR/WEB-INF/lib文件夹中
此解决方案的缺点是,您必须通过build.xml,i.s.o.通过appengine eclipse插件进行部署。请注意,从版本1.7.4开始:
现在可以将所有WEB-INF/classes/*类打包到jar文件中。这可以通过新的
——在工具中启用\u jar\u类
选项。默认情况下,未设置此选项
如中所述,App Engine SDK支持将WEB-INF/classes
打包到jar文件中,该文件最终将位于WEB-INF/lib/\u ah\u webinf\u classes-0000.jar
。你可以激活这个
使用appcfg工具和选项--启用\u jar\u类
通过配置WAR或EAR项目的属性来使用Eclipse的Google插件:项目属性>Google App Engine>部署>“将WEB-INF/类打包为jar”
对我来说,在AppEngine1.9.4上,这只导致了实例加速方面的轻微改进(大约5-10%,如果有的话)
请注意,这将把所有文件打包到WEB-INF/classes中(而不仅仅是.class文件)。更改之后,我在实例化过程中收到一条错误消息,说明无法再读取logging.properties文件;可能是因为当时还没有读取新的jar文件:
无法读取java.util.logging配置文件WEB-INF/classes/logging.properties
作为一种解决方法,我将appengine-web.xml中的路径更改为web-INF/logging.properties
,并将maven war插件配置为将文件复制到该位置:
<webResources>
<resource>
<directory>lib</directory>
<targetPath>WEB-INF/lib</targetPath>
</resource>
<resource>
<!-- Workaround: During GAE deployment, all files in WEB-INF/classes will be packaged into WEB-INF/lib/_ah_webinf_classes-0000.jar,
which prevents the logging.properties referenced in appengine-web.xml from being read. -->
<directory>src/main/resources</directory>
<includes>
<include>logging.properties</include>
</includes>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
解放党
WEB-INF/lib
src/main/resources
日志记录。属性