Подтвердить что ты не робот

Настройте Eclipse для предварительной сборки классов App Engine в один JAR для ускорения разминки

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

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

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

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

Спасибо,

4b9b3361

Ответ 1

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

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

  • с помощью Google Плагина для Eclipse, настроив свойства вашего проекта WAR или EAR: Свойства проектa > Google App Engine > Развертывание > "Пакет WEB-INF/classes как банку"

Для меня, в 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, чтобы скопировать файл в это место:

                <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

Что мы сделали в Eclipse:

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Один из способов может быть достигнут, если выполнить развертывание через 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.

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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