Сконфигурируйте Eclipse, чтобы предварительно объединить классы App Engine в один JAR для более быстрого прогрева - PullRequest
21 голосов
/ 22 февраля 2012

После некоторого обсуждения с коллегой из другой компании, которая также использует App Engine, он сказал мне, что ему удалось сократить время прогрева приложения с ~ 15 секунд до ~ 5 секунд, выполнив следующие шаги:

  1. Настройте Eclipse для объединения классов, созданных во время компиляции, в один файл JAR.
  2. Настройте Eclipse для загрузки этого единственного файла JAR вместо сотен (или тысяч) отдельных классов Java во время развертывания App Engine.

Он утверждает, что во время прогрева экземпляра, поскольку экземпляру нужно загружать только один связанный JAR-файл вместо тысяч отдельных классов, прогрев будет значительно быстрее.Есть какие-нибудь мысли или мнения по этому поводу?

Я бы определенно хотел попробовать это сам, но мне не хватает Eclipse-mojo, чтобы знать, как настроить такие шаги.Кто-нибудь знает, как настроить Eclipse или плагин Google для Eclipse, чтобы выполнить действия, описанные выше?(И, конечно, развернутые приложения успешно работают в App Engine)

Спасибо,

Ответы [ 7 ]

4 голосов
/ 27 сентября 2012

То, что мы сделали в Eclipse, было:

  • В Свойствах проекта> Путь сборки Java (вкладка «Источник») измените папку вывода из war / WEB-INF / classes на что-то другое, например bin (я считаю,Eclipse однажды пожаловался на это)
  • В Project Properties> Builders добавьте новый компоновщик (я использовал тип "компоновщик программ" и указал его на исполняемый файл jar в моем JDK, но, как уже упоминалось, Ant Builder тоже будет работать).Очевидно, что вы должны настроить этот конструктор так, чтобы он получал входные данные оттуда, куда вы решили записать файлы классов, и выводил что-то вроде war / WEB-INF / lib / myclasses.jar

Вы можете настроитьjar builder для автоматического запуска при изменении файлов классов (которые, в свою очередь, обычно автоматически перекомпилируются при изменении исходных файлов).

Однако есть некоторые недостатки.По какой-то причине плагин google eclipse смущает ваше изменение выходного каталога компилятора java.Это означает, что вам придется вручную указывать на каталог war при развертывании, и я считаю, что вам придется вручную скопировать некоторые файлы GAE в папку war / WEB-INF / lib.

3 голосов
/ 27 сентября 2012

Одним способом этого можно достичь, если выполнить развертывание через Ant, как описано в: https://developers.google.com/appengine/docs/java/tools/ant

Затем вы можете изменить файл ant build.xml для вызова команды ant для создания файла jar. Непосредственно перед фактическим развертыванием вы можете удалить или переместить скомпилированные артефакты. Jar-файл сборки должен быть помещен в папку WAR / WEB-INF / lib.

Недостатком этого решения является необходимость развертывания через build.xml, i.s.o. через плагин appengine eclipse.

3 голосов
/ 07 июля 2012

Я не знаю, как (или если) вы можете интегрировать его в затмение, но это довольно тривиально сделать с 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>

Я добавлю, что я сделалне испытывает 3-кратного сокращения времени запуска приложения.В этой теме я опубликовал несколько экспериментальных чисел:

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

Что я обнаружил, так это то, что вместо резкого изменения в 20-45 с, мое приложение постоянно загружалось в 20 с.Впоследствии он не оставался таким непротиворечивым, но я все еще использую классы как стандартную часть развертывания.

2 голосов
/ 13 мая 2014

Как указано в более раннем ответе , SDK App Engine поддерживает упаковку WEB-INF/classes в файл jar, который в итоге будет иметь значение WEB-INF/lib/_ah_webinf_classes-0000.jar. Вы можете активировать это

  1. с помощью инструмента appcfg с параметром --enable_jar_classes.

  2. с использованием плагина Google для Eclipse путем настройки свойств проекта WAR или EAR: Свойства проекта> Google App Engine> Развертывание> «Пакет WEB-INF / classes как jar»

Для меня в App Engine 1.9.4 это привело к незначительному улучшению раскрутки экземпляров (около 5-10%, если есть).


Обратите внимание, что при этом будут упакованы все файлы в классах WEB-INF / (не только в .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 для копирования файла в это местоположение:

                <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>
2 голосов
/ 26 декабря 2012

Обратите внимание, что с версии 1.7.4:

Теперь вы можете упаковать все классы WEB-INF / classes / * в файлы jar. Это можно сделать через новый

Опция

--enable_jar_classes в инструментах appcfg . По умолчанию эта опция не установлена.

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

1 голос
/ 24 апреля 2012

Я думаю, что самый простой способ сделать это - создать отдельный проект, в который вы пишете весь код, а также хранить любые другие зависимости.Когда вы будете готовы к развертыванию, экспорт Eclipse в исполняемый JAR-файл может упаковать все зависимости и ваши классы в один JAR-файл, который затем будет использоваться в качестве единственной зависимости в развертываемом проекте Google App Engine, который в основном состоит из любогофайлы конфигурации в папке WEB-INF, а также другие статические ресурсы + один большой JAR-файл.

В качестве альтернативы экспорту eclipse вы можете настроить его как сборку Maven или Ant, которая также может выполнять перепаковку.

0 голосов
/ 23 февраля 2012

Он утверждает, что во время прогрева экземпляра необходимо загружать только экземпляр единый файл WAR вместо тысяч отдельных классов, разогрев будет значительно быстрее. Есть мысли или мнения по этому поводу?

Я сомневаюсь в этом. WAR - это просто ZIP-файл, который распаковывается при развертывании на сервере. Таким образом, существует дополнительный шаг, означающий, что процесс может быть одинаково быстрым (если распакован при загрузке) или медленным (если распакован при вращении экземпляра).

...