Java 如何将tomcat工作设置为调试模式?

Java 如何将tomcat工作设置为调试模式?,java,tomcat,tomcat5.5,Java,Tomcat,Tomcat5.5,我使用上下文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/w

我使用上下文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,你实际上混淆了“调试”和热部署的概念。您可以将Tomcat配置为调试模式,然后远程调试在Tomcat内部运行的应用程序,这样当您在代码中添加断点时,调试器将跳转到该断点并停止执行

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

下面是一个实际的例子:

假设您在目录c:\myProject中有一个maven项目。在c:\myProject\src中有源文件,然后在编译它时,会在c:\myProject\target\myProject.war和c:\myProject\target\myProject中分别获得war文件和war文件内容的分解目录。现在,如果将tomcat配置为对于myProject tomcat上下文,将工作目录配置为c:\myProject\target\myProject,那么每次修改.java文件时,.class对应的文件都会在target(现在也在工作)目录中更新,tomcat会将其考虑在内

实际上,我已经使用这种设置来开发tomcat,但它不是最好的。首先,tomcat将仅热部署某些修改,例如当您修改现有方法主体中的某些内容时。其他的修改将不被考虑,比如添加一个新的方法——为此,您必须进行一次完全的重新部署,以将其考虑在内


更好的解决方案是将maven与maven jetty插件结合使用。这件事真的可以按您的意愿工作:您对jsp文件类所做的任何修改都会立即被考虑,并在jetty内部运行的应用程序中可见

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

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

下面是一个实际的例子:

假设您在目录c:\myProject中有一个maven项目。在c:\myProject\src中有源文件,然后在编译它时,会在c:\myProject\target\myProject.war和c:\myProject\target\myProject中分别获得war文件和war文件内容的分解目录。现在,如果将tomcat配置为对于myProject tomcat上下文,将工作目录配置为c:\myProject\target\myProject,那么每次修改.java文件时,.class对应的文件都会在target(现在也在工作)目录中更新,tomcat会将其考虑在内

实际上,我已经使用这种设置来开发tomcat,但它不是最好的。首先,tomcat将仅热部署某些修改,例如当您修改现有方法主体中的某些内容时。其他的修改将不被考虑,比如添加一个新的方法——为此,您必须进行一次完全的重新部署,以将其考虑在内


更好的解决方案是将maven与maven jetty插件结合使用。这件事真的可以按您的意愿工作:您对jsp文件类所做的任何修改都会立即被考虑,并在jetty内部运行的应用程序中可见

要做你想做的事情,你需要一些类似的东西,我知道有一些开源软件可以做同样的事情。

要做你想做的事情,你需要一些类似的东西,我知道有一些开源软件可以做同样的事情。

好的,这里有一个实际的例子:

我有一个
cnaswar
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>