如何在调试模式下设置tomcat工作?

时间:2011-09-11 10:55:04

标签: java tomcat tomcat5.5

我使用context xml将应用程序部署到tomcat。我希望tomcat在调试模式下工作,我的意思是如果我改变一个函数内部的东西,比如改变 字符串a =“123”; 至 字符串a =“456”; tomcat应该在不重新加载应用程序的情况下进行更改。

%CATALINA_HOME%/ conf / Catalina / localhost

下的web01.xml
<?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 个答案:

答案 0 :(得分:3)

你实际上混淆了“调试”和热部署的概念。您可以将Tomcat配置为调试模式,然后远程调试在tomcat中运行的应用程序,这样当您在代码中添加断点时,调试器将跳转到该断点并暂停执行。

您实际需要的是有可能热部署应用程序。使用tomcat,如果修改.java文件然后将它们复制到tomcat的工作目录中,你将得到你想要的,即能够在类中更改某些内容并让正在运行的tomcat部署的应用程序将其带入帐户无需重新部署整个应用程序。您可以通过配置tomcat应用程序上下文(在tomcat server.xml文件中或在项目特定的context.xml文件中)使应用程序将项目代码编译为工作目录来自动执行此操作。

这是一个实际的例子:

假设您在目录c:\ myProject中有一个maven项目。您在c:\ myProject \ src中有源文件,然后在编译时,您将获得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 :(得分:1)

好的,这是一个实际的例子:

我有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,则将部署并运行war。此时,如果我在Eclipse中修改.java文件中的方法内容(并保存),那么Tomcat会自动考虑该代码,并且应用程序的行为会有所不同,无需任何额外的重新部署。希望这有帮助

答案 2 :(得分:0)

答案 3 :(得分:0)

要做你想做的事情,你需要一些像java rebel这样的东西或类似的东西,我知道有一些开源alternatives来做同样的事情。