Код HotSwaping в mvnDebug tomcat: запустить

Обычно я запускаю Tomcat с помощью mvnDebug tomcat:run.

После изменения кода мне нужно использовать mvn tomcat:redeploy.

Это неоптимально, потому что я часто изменяю только содержимое существующих тел методов.

Могу ли я выполнить горячую замену тела метода во время выполнения и выполнить горячее развертывание в качестве запасного варианта?

К сожалению, я не нашел ничего лучше maven-hotswap-plugin.

лица-config.xml

... <application>
  <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
  <locale-config>
   <default-locale>de_DE</default-locale>
  </locale-config>
  <resource-bundle>
   <base-name>Message</base-name>
   <var>message</var>
  </resource-bundle>
  <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
 </application>
</faces-config>

web.xml:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

pom.xml:

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-envers</artifactId>
        <version>4.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>net.java.dev.ajax4jsf</groupId>
        <artifactId>ajax4jsf</artifactId>
        <version>1.0.6</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.6.6.Final</version>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>1.2.10</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-impl</artifactId>
        <version>1.2.10</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.myfaces.tomahawk</groupId>
        <artifactId>tomahawk12</artifactId>
        <version>1.1.9</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.facelets</groupId>
        <artifactId>jsf-facelets</artifactId>
        <version>1.1.14</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>3.1.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.2-1004-jdbc41</version>
    </dependency>

    <dependency>
        <groupId>servletapi</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <contextReloadable>true</contextReloadable>
            </configuration>
        </plugin>
    </plugins>
</build>

person Grim    schedule 04.02.2014    source источник
comment
techblog.bozho.net/?p=1246   -  person Bozho    schedule 04.02.2014
comment
stackoverflow.com/questions/998737/   -  person Bozho    schedule 04.02.2014
comment
@Bozho Жаль, 1.7 не поддерживается DCEVM.   -  person Grim    schedule 04.02.2014
comment
С неструктурными изменениями режим отладки должен работать?   -  person Bozho    schedule 04.02.2014
comment
Я тоже так думал. Если я запускаю его с внутренним экземпляром tomcat eclipse, он работает хорошо, но не с mvnDebug tomcat:run.   -  person Grim    schedule 04.02.2014
comment
Также проверьте stackoverflow.com/questions/9572556 /   -  person Leonard Brünings    schedule 07.02.2014
comment
Есть ли какая-то конкретная причина, по которой вы не отлаживаете встроенный сервер IDE? Почему вы запускаете приложение через maven?   -  person Pavel Horal    schedule 11.02.2014
comment
@PavelHoral из-за преимуществ системы управления сборкой и меньшего количества настроек.   -  person Grim    schedule 11.02.2014
comment
@PeterRader Не уверен, что вы имеете в виду под меньшей конфигурацией. Мы используем Maven в нашей компании и его нулевую конфигурацию, чтобы заставить его работать внутри Eclipse / Tomcat с m2e. Разработчики просто проверяют репозиторий в Eclipse, включают Maven nature и готовы запускать / отлаживать его.   -  person Pavel Horal    schedule 11.02.2014
comment
Какую версию maven-tomcat-plugin вы используете? Я использую 2.2, и горячая замена Eclipse работает нормально. Похоже, вы используете какой-то старый плагин, возможно, версию 1.1, потому что новые версии должны называться tomcat6 или tomcat7, например. mvnDebug tomcat7:run   -  person maksim_khokhlov    schedule 11.02.2014
comment
@PavelHoral а как насчет jndi-ресурсов? Подтвержденная папка? коннекторы и регистраторы? как насчет конфигурации глобального контекста? нативные библиотеки и управление версиями? Балансир-конфигурация? Раньше мы писали электронные письма без связи с какой-либо задачей в баг-трекере, без какой-либо вики-страницы, без какой-либо документации. Таким образом, у нас есть все сразу, и он работает намного лучше, даже без горячей замены.   -  person Grim    schedule 11.02.2014
comment
@maksim_khokhlov Хм, может ты и прав, я использую 2.1. Можете ли вы определить это как ответ?   -  person Grim    schedule 12.02.2014
comment
@PeterRader Не уверен, что вы имели в виду под электронным письмом, задачей, вики, ... комментарием. Но я понимаю, что запуск в Eclipse - это не вариант для вас (даже если вы, на мой взгляд, он лучше, чем запуск из Maven).   -  person Pavel Horal    schedule 12.02.2014
comment
@PavelHoral Извините за неправильную заметку. Если я объединю все изменения конфигурации в tomcat только для того, чтобы быть актуальным, очень часто стоит около часа.   -  person Grim    schedule 12.02.2014
comment
Пробовали ли вы отключить собственный механизм развертывания TOmcats (который уже может быть таковым при работе таким образом) и запустить Maven в режиме отладки, чтобы встроенный Tomcat также работал в режиме отладки? Тогда у вас должна появиться возможность горячей замены.   -  person Thorbjørn Ravn Andersen    schedule 12.02.2014
comment
@ ThorbjørnRavnAndersen Да, я пробовал это. К сожалению, горячая замена все еще не работает.   -  person Grim    schedule 13.02.2014
comment
Я предоставлю больше информации. @maksim_khokhlov писал отлично работает, может есть баг.   -  person Grim    schedule 13.02.2014
comment
Все еще не могу заставить его работать.   -  person Grim    schedule 17.02.2014


Ответы (7)


Вы можете использовать Jrebel - он работает именно так, как вы ожидаете. Вам просто нужно указать javaagent, и он перезагрузит все классы и изменения фреймворка во время выполнения. Он также работает с удаленными серверами.

Чтобы интегрировать его с проектом maven, вам необходимо добавить jrebel-maven-plugin, который будет сгенерировать все файлы конфигурации (rebel.xml).

Без JRebel вы можете использовать стандартный механизм HotSwap, но он позволяет только перезагружать тела методов.

person Jakub Kubrynski    schedule 07.02.2014
comment
Пожалуйста, предоставьте дополнительную информацию о том, как это работает с maven. - person Leonard Brünings; 07.02.2014
comment
Сбросить 365 $ в год, потому что я неправильно использую инструменты? Кем вы работаете? Специалист по маркетингу в JRebel? ;-) - person Grim; 07.02.2014
comment
@PeterRader Я предполагаю, что вы используете Eclipse, потому что IntelliJ слишком дорогой? :) Если вы знаете какую-либо бесплатную альтернативу jrebel, просто дайте мне знать - person Jakub Kubrynski; 07.02.2014
comment
@JakubK Я верю, что нет бесплатной альтернативы, которая почти достигла бы вершины искусства, которое есть у jrebel. Но горячей замены мне было бы достаточно. - person Grim; 11.02.2014
comment
У меня есть тестовая версия jrebel, ненавижу, с maven не работает! - person Grim; 11.08.2015

Одно из лучших решений в вашей ситуации - JRebel.

  • Что вам нужно сделать, так это внести соответствующие изменения в структуру и интегрировать ее с помощью jrebel-maven-plugin.
    Он позволяет перезагрузить все тела методов.
  • Как только вы закончите с подключением, будет сгенерирован автоматический файл конфигурации xml, который будет использоваться в качестве файла конфигурации для плагина.
  • Также упомяните свой Java-агент.
  • После успешного тестирования вы также можете интегрировать его со сборкой
person D3X    schedule 12.02.2014
comment
Извините, я пробовал это, но он не работает с maven. - person Grim; 11.08.2015

JRebel - хороший вариант. Это недешево, но доступны лицензии с открытым исходным кодом. Инструкции по установке Maven находятся здесь: http://zeroturnaround.com/software/jrebel/learn/maven/

Мы получаем это через определенный профиль запуска и встроенный Tomcat. Это особый подмодуль, который зависит от других проектов, которые создают войны веб-приложений. Итак, если вы настроите что-то вроде следующего в подмодуле runner:

<profiles>
         <profile>
             <id>run</id>
             <build>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.tomcat.maven</groupId>
                         <artifactId>tomcat7-maven-plugin</artifactId>
                         <executions>
                             <execution>
                                 <id>run-wars</id>
                                 <goals>
                                     <goal>run-war-only</goal>
                                 </goals>
                                 <phase>integration-test</phase>
                             </execution>
                         </executions>
                         <configuration>
                            <warDirectory>theWar</warDirectory>
                            <path>/relativepath</path>
                            <systemProperties>
                            <webapps>
                                <webapp>
                                    <groupId>${project.groupId}</groupId>
                                    <artifactId>myArtifact</artifactId>
                                    <version>${project.version}</version>
                                    <type>war</type>
                                    <asWebapp>true</asWebapp>
                                    <contextPath>myContext</contextPath>
                                 </webapp>
                             </webapps> 
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
</profiles>

Вы можете запустить это с помощью mvn package -Prun, которое вы сможете завершить с помощью Ctrl+C.

Затем, пока это выполняется в одном терминале, внесите изменения в код, откройте новый терминал и запустите mvn compile. С выходом JRebel изменения должны практически мгновенно отразиться в вашем веб-приложении.

Ничего не должно мешать вам выполнять эти же задачи через плагин Eclipse m2e.

person Mardoz    schedule 07.02.2014

Похоже, вы можете использовать какую-то старую версию плагина maven tomcat, потому что более новые версии должны называться tomcat6 или tomcat7, например. mvnDebug tomcat7:run. Я использую 2.2, и горячая замена Eclipse работает нормально.

Чтобы немного пояснить, вот что я вижу в командной строке при запуске приложения с mvn tomcat:run:

...
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) @ tomcatMvnDebug >>>
...

Обратите внимание на 1.1.

И вот что я вижу при запуске приложения с mvn tomcat7:run:

...
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ tomcatMvnDebug >>>
...

Обратите внимание, что на этот раз maven использует подключаемый модуль tomcat версии 2.2.

person maksim_khokhlov    schedule 11.02.2014
comment
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ ... но горячая замена все равно не работает. - person Grim; 14.02.2014

Я бы использовал функции HotSwap Eclipse или IntelliJ. У меня оба работают очень хорошо: просто запустите maven goal в режиме отладки (tomcat: run).

person Jan    schedule 13.02.2014

Обычно мы разрабатываем веб-приложения с использованием grails, в котором уже есть функция перезагрузки, я считаю, что это сделано с помощью подпружиненного плагина. Это может быть замена jRebel (хотя я не уверен, сработает ли он для вас, но если вы хотите сэкономить несколько сотен долларов, возможно, стоит попробовать).

Итак, в основном я вижу следующие варианты:

  • Используйте фреймворк, который уже поддерживает перезагрузку классов (Grails, Play).
  • Используйте какой-нибудь javaagent, например spring loaded или JRebel
  • Используйте какой-нибудь javaagent, интегрированный в IDE (я использую IntelliJ IDEA и настоятельно рекомендую его. Хотя не уверен, работает ли он в бесплатной версии сообщества).

https://github.com/spring-projects/spring-loaded

person BaRoN    schedule 14.02.2014
comment
Я знаю Grails хорошо, но горячая замена - это больше, чем перезагрузка. В любом случае, спасибо. - person Grim; 11.06.2014

Существует плагин maven. Похоже, что это не поддерживается. Однако, бегло взглянув на исходный код, я считаю, что вы можете заставить его работать.

Он основан на аналогичном плагине для ant, поэтому в качестве альтернативы вы можете использовать maven antrun для выполнения этого

Тем не менее, он будет иметь те же возможности (и ограничения), что и горячая замена в любой среде IDE.

person František Hartman    schedule 10.02.2014
comment
Проголосовать против? Операция запрашивает что-то вроде maven-hotswap-plugin - что не так с предоставлением ссылок на такие. - person František Hartman; 12.02.2014