2011-09-11 26 views
0

コンテキストxmlを使用してTomcatにアプリケーションをデプロイします。私はtomcatの作業をデバッグモードにしたい、というのは、変更のような関数内で何かを変更すると意味する。 String a = "123"; 〜 文字列a = "456"; tomcatは、アプリケーションをリロードせずに変更を取得する必要があります。tomcatをデバッグモードで設定するには?

web01.xml%下CATALINA_HOME%の/ confに/カタリナ/ 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がクラスをリロードしなかったのですか。デバッグモードとして動作させるにはどうすればよいですか?

私は現在Eclipseを使用していません。 reloadable = "true"に設定したくない場合は、クラスが変更された場合にアプリケーション全体がリロードされます。

私はあなたが実際に "デバッグ" およびホットデプロイの概念を混乱させているtomcat5.5.23

答えて

1

[OK]を、ここでは実際の例です:

私はcnas-war Mavenプロジェクトを持っています。私は通常、.classファイル、.jspファイルのファイル、.jarファイルのように、.warファイルにパッケージになるだろうすべてのものを持って、ここで

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

:私はMavenのでそれを構築したら、私は以下のディレクトリを取得します効果的には.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> 

は、「文脈」タグに私はスナップショットディレクトリ(戦争の後に爆発したものを指している文書ベースのプロパティを持っていますMavenはそれを構築します)。さて、この設定でこのプロジェクトをEclipseにインポートすると、mavenビルドを行い、このTomcatを起動すると、戦争が展開され実行されます。この時点で、Eclipse内の.javaファイル内のメソッドの内容を変更して保存すると、そのコードは自動的にTomcatによって考慮され、アプリケーションは余分な再デプロイメントをすることなく、異なる動作をします。これが役に立てば幸いです

+0

あなたの例のおかげで、私のEclipseはEclipseから起動するとホットコードを置き換えることができますが、今はEclipseを使用することができません。起動時にhot.batファイルを使用するようにTomcatを設定する方法を知りたい。 – zhangcheng

+0

上記の例では、tomcatはEclipse内で決して設定されていません。それはseparatelly(起動する場合はstartup.bat)で開始されます。 EclipseはTomcat内部のホットデプロイメントとは関係ありません(Tomcatコネクタで容易に展開できますが、必須ではありません)。 –

3

を使用。デバッグモードにTomcatを設定し、コードにブレークポイントを追加すると、デバッガはそのブレークポイントにジャンプして実行を停止するように、tomcat内で実行中のアプリケーションをリモートでデバッグできます。

実際に必要なのは、アプリケーションをホットデプロイできる可能性があることです。 Tomcatでは、.javaファイルを変更してtomcatの作業ディレクトリにコピーすると、クラス内の何かを変更し、実行中のTomcatデプロイされたアプリケーションで実行させることができます。アプリケーション全体を再デプロイする必要はありません。これを自動化するには、tomcatのアプリケーションコンテキスト(Tomcatのserver.xmlファイルまたはプロジェクト固有のcontext.xmlファイルのいずれか)を設定し、アプリケーションがプロジェクトコードがコンパイルされるディレクトリを作業ディレクトリとして持つようにします。ここ

は実際の例です:\ MyProjectを:

は、あなたがディレクトリc Mavenプロジェクトを持っているとしましょう。 c:\ myProject \ srcにソースファイルがあり、それをコンパイルすると、warファイルとc:¥myProject¥target¥myProject.warのwarファイルコンテンツの展開されたディレクトリがそれぞれ取得されますc:\ myProject \ target \ myProject。さて、あなたがtomcatコンテキストをmyprojectのために設定すると、作業ディレクトリがc:\ myProject \ target \ myProjectとして設定されていれば、.javaファイルを変更するたびに.classファイルが更新されます。ターゲット(と今も働いている)dir、そしてtomcatがそれを考慮に入れます。

私は実際にtomcatで開発するためにこのような設定を使用しましたが、それは最良ではありません。まず、Tomcatは、既存のメソッドの本体で何かを変更するときなど、特定の変更のみをホットデプロイします。新しいメソッドを追加するなど、他の変更は考慮されません。このためには、完全に再デプロイして考慮する必要があります。

もっと良い解決策は、maven jettyプラグインでmavenを使用することです。このことは、あなたが望むように実際に動作します。jspファイルのクラスに対して行う変更は、即座に考慮され、桟橋内の実行中のアプリケーションに表示されます。

+0

はい、私はホットコードの置き換えです、私はちょうどtomcatは、コードを置き換えることができます私は既存のメソッドの本体で何かを変更します。しかし、それは動作しませんでした。私は設定ファイルに間違いを犯しましたか? – zhangcheng

0

java rebelのような何かが必要な場合や、同じことをするいくつかのオープンソースalternativesがあることが分かります。

関連する問題