Как настроить работу Tomcat в режиме отладки? - PullRequest
0 голосов
/ 11 сентября 2011

Я развертываю приложение для Tomcat с контекстом XML. Я хочу, чтобы tomcat работал в режиме отладки, я имею в виду, если я изменю что-то внутри функции, например изменение Строка a = "123"; в Строка a = "456"; Tomcat должен получить изменение без перезагрузки приложения.

Файл web01.xml в папке% CATALINA_HOME% / conf / Catalina / localhost

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="d:/document/workspace3.6/web01/WebContent" path="/web01" reloadable="false" debug="1" ></Context>

но теперь tomcat не сработал, как я ожидал, если я заменю старый файл класса новой версией, я должен перезапустить tomcat, чтобы получить изменения.

Почему Tomcat не перезагрузил класс, Как мне сделать так, чтобы он работал в режиме отладки?

Я не использую Eclipse сейчас. и я не хочу устанавливать reloadable = "true", это перезагрузит все приложение, если класс был изменен.

Я использовал tomcat5.5.23

Ответы [ 4 ]

3 голосов
/ 11 сентября 2011

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

Что вам действительно нужно, так это возможность горячего развертывания приложения. С tomcat, если вы измените файлы .java, а затем скопируете их в рабочий каталог tomcat, вы получите именно то, что вам нужно, а именно возможность что-то изменить в классе и заставить запущенное приложение, развернутое на tomcat, перенести его в аккаунт без повторного развертывания всего приложения. Это можно автоматизировать, настроив контекст приложения tomcat (либо в файле tomcat server.xml, либо в файле context.xml для конкретного проекта), чтобы приложение в качестве рабочего каталога имело каталог, в который компилируется код вашего проекта.

вот фактический пример:

Допустим, у вас есть проект maven в каталоге c: \ myProject. У вас будут исходные файлы в c: \ myProject \ src, а затем при компиляции вы получите файл war и разнесенный каталог содержимого файла war в c: \ myProject \ target \ myProject.war и соответственно C: \ MyProject \ цель \ MyProject. Теперь, если вы настроите свой tomcat таким образом, чтобы для контекста myProject tomcat у вас был рабочий каталог, настроенный как c: \ myProject \ target \ myProject, то каждый раз, когда вы изменяете файл .java, соответствующий файл .class будет обновляться в целевой (и теперь также работающий) dir, и tomcat примет это во внимание.

Я действительно использовал такую ​​настройку для разработки с tomcat, но она не самая лучшая. Прежде всего tomcat будет горячо развертывать только определенные модификации, например, когда вы изменяете что-либо в теле существующего метода. Другие изменения не будут приняты во внимание, например, добавление нового метода - для этого вам необходимо выполнить полное повторное развертывание, чтобы учесть его.

Гораздо лучшим решением является использование maven с плагином maven jetty. Это действительно работает так, как вы хотите: любые изменения, которые вы вносите в класс jsp-файла, будут немедленно приняты во внимание и будут видны в работающем приложении внутри Jetty.

1 голос
/ 11 сентября 2011

Хорошо, вот фактический пример:

У меня есть проект cnas-war maven.Как только я собрал его с помощью Maven, я получил следующий каталог:

c:/_andrei/work/cnas/cnas-war/target\cnas-war-0.0.1-SNAPSHOT

Здесь у меня есть все, что обычно упаковывается в файл .war, например файлы .class, файлы .jsp,.jar-файлы и т. д. По сути, это файл .war в разобранном виде.

У меня также есть Tomcat 5.5, специально предназначенный для развертывания этой войны, который ловко помещен в папку tomcat_cnas.В конфигурационном файле Tomcat (conf\server.xml) у меня есть следующее:

    <?xml version="1.0" encoding="utf-8"?>
<!-- Example Server Configuration File -->
<!-- Note that component elements are nested corresponding to their
     parent-child relationships with each other -->
<!-- A "Server" is a singleton element that represents the entire JVM,
     which may contain one or more "Service" instances.  The Server
     listens for a shutdown command on the indicated port.

     Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" or "Loggers" at this level.
 -->
<Server port="8125" shutdown="SHUTDOWN">
  <!-- Comment these entries out to disable JMX MBeans support used for the 
       administration web application 
  <Listener className="org.apache.catalina.core.AprLifecycleListener" />
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/> -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <!-- Global JNDI resources -->
  <GlobalNamingResources>
    <!-- Test entry for demonstration purposes -->
    <Environment name="simpleValue" type="java.lang.Integer"
    value="30" />
    <Resource auth="Container"
    configurationDirectory="c:/cnas-content"
    factory="com.genia.toolbox.web.jndi_config.StringContainerFactory"
    name="string/activitymanagerConfigurationContainer"
    type="com.genia.toolbox.web.jndi_config.StringContainer" />
    <Resource name="string/activitymanagerConfigurationContainer"
    auth="Container"
    type="com.genia.toolbox.web.jndi_config.StringContainer"
    factory="com.genia.toolbox.web.jndi_config.StringContainerFactory"
    configurationDirectory="c:/cnas-content" />
  </GlobalNamingResources>
  <!-- Define the Tomcat Stand-Alone Service -->
  <Service name="Catalina">
    <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <Connector acceptCount="100" connectionTimeout="20000"
    disableUploadTimeout="true" enableLookups="false"
    maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150"
    minSpareThreads="25" port="8081" redirectPort="8443" />
    <!-- Define the top level container in our container hierarchy -->
    <Engine defaultHost="localhost" name="Catalina">
      <!-- for activitymanager -->
      <Host name="localhost" appBase="webapps" unpackWARs="true"
      autoDeploy="true" xmlValidation="false"
      xmlNamespaceAware="false">
        <Context path="/cnas"
        docBase="c:/_andrei/work/cnas/cnas-war/target/cnas-war-0.0.1-SNAPSHOT/"
        workDir="c:/_andrei/work/cnas/cnas-war/target/work-cnas/">
          <ResourceLink name="string/configurationContainer"
          global="string/activitymanagerConfigurationContainer"
          type="com.genia.toolbox.web.jndi_config.StringContainer" />
          <Resource name="bean/cnasConfig" auth="Container"
          type="com.genia.toolbox.projects.cnas.war.config.CnasConfig"
          factory="org.apache.naming.factory.BeanFactory"
          classpath="false" fileSystem="true"
          applicationFileLocation="c:/cnas-content/application.properties" />
          <Resource name="bean/cnasApplicationData"
          auth="Container"
          type="com.genia.toolbox.projects.cnas.war.config.CnasConfig"
          factory="org.apache.naming.factory.BeanFactory"
          classpath="false" fileSystem="true"
          applicationFileLocation="c:/cnas-content/cnas_application_data.xml" />
        </Context>
        <!--Context docBase="C:/travail/workspace/cnas/cnas-ws-proxy/target/webapp" path="/proxy">

                <Resource name="bean/params" 
                    auth="Container"
                    type="fr.genia.cnas.config.Parameters" 
                    factory="org.apache.naming.factory.BeanFactory"
                    log4jFile="" 
                    serviceUrl="" 
                    debugMode="true" >

                </Resource>

            </Context-->
      </Host>
    </Engine>
  </Service>
</Server>

Как вы можете видеть, в теге "context" у меня есть свойство docBase, указывающее на каталог моментальных снимков (тот, гдеВойна взорвана после того, как Maven строит ее).Теперь, с этой настройкой и импортированием этого проекта в Eclipse, если я сделаю сборку maven, а затем запусту этот Tomcat, война будет развернута и запущена.На этом этапе, если я изменю содержимое метода в файле .java внутри Eclipse (и сохраню), то этот код будет автоматически учтен Tomcat, и приложение будет вести себя по-другому, без какого-либо дополнительного повторного развертывания.Надеюсь, это поможет

0 голосов
/ 11 сентября 2011

Чтобы сделать то, что вы пытаетесь сделать, вам понадобится что-то вроде java rebel или нечто подобное. Я знаю, что есть несколько открытых альтернатив , чтобы сделать то же самое.

0 голосов
/ 11 сентября 2011
...