📓 Archive

  • Pricing
  • Chess
  • Syntax
  • TOMCAT

    FGJ: Create:2024/08/08 Update: (2024-10-24)

    • Intro(TOMCAT) #

      正常启动参数
      /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/java
      -Djava.util.logging.config.file=/Users/stevenobelia/software/apache-tomcat-8.5.53/conf/logging.properties
      -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
      -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
      -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
      -agentlib:jdwp=transport=dt_socket,address=12302,server=y,suspend=y
      -Dignore.endorsed.dirs=
      -classpath /Users/stevenobelia/software/apache-tomcat-8.5.53/bin/bootstrap.jar:/Users/stevenobelia/software/apache-tomcat-8.5.53/bin/tomcat-juli.jar
      -Dcatalina.base=/Users/stevenobelia/software/apache-tomcat-8.5.53
      -Dcatalina.home=/Users/stevenobelia/software/apache-tomcat-8.5.53
      -Djava.io.tmpdir=/Users/stevenobelia/software/apache-tomcat-8.5.53/temp
      org.apache.catalina.startup.Bootstrap start

      • CATALINA_BASE VS CATALINA_HOME #

        Tip

        参考 CATALINA_HOME_and_CATALINA_BASEtomcat-catalina-base-and-catalina-home-variables

        CATALINA_HOME:表示 tomcat 安装根目录,(可以理解为启动程序,主要包含一些二进制.jar文件和执行脚本)
        CATALINA_BASE:表示 tomcat 实例的运行配置根目录,(主要是配置,日志,部署的应用,其他运行依赖等,并且优先级比CATALINA_HOME高)

        为什么需要有CATALINA_BASE目录。默认情况下,两个指向相同的目录。如果需要运行多个tomcat实例的话需要手动指定CATALINA_BASE目录。这样做的好处有以下几点(都是在运行多实例的情况下):
        1). 对于管理tomcat版本升级来说更为简单,咱们只需要替换tomcat运行依赖即可,即CATALINA_HOME中的jar包
        2). 避免复制tomcat运行依赖(节省磁盘空间)
        3). 共享某些设置,比如setenv.sh

        需要注意:CATALINA_BASE目录至少包含conf/server.xmlconf/web.xml两个文件。

      • Context配置 #

        Tip

        参考 A word on ContextsDefining a context

        Context表示一个tomcat web application。为了在 tomcat 中配置一个 Context ,需要一个叫作Context Descriptor的东西。这个是一个包含Context配置相关的xml文件。

        每个应用单独的Context
        1). $CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml【idea中tomcat使用这种方式:如下图】
        2). $CATALINA_BASE/webapps/[webappname]/META-INF/context.xml
        3). Inside a Host element in the main conf/server.xml.

        默认(共享)的Context
        1). $CATALINA_BASE/conf/context.xml,所有的web应用都会加载。
        2). $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default,每一个虚拟主机都会加载。

        在早期的版本中,这些配置被放在server.xml中。现在虽不鼓励这么做,但是也支持。因为对Context做修改的话,如果不重启tomcat的话,server.xml是不会被重载的。这会表现出较强的侵入性。所以默认的Context配置会复写任何在server.xml中定义的<Context>元素。可以使用override=true属性来阻止这种行为。

        • IDEA中配置Context的方式 #

      • BIN目录介绍 #

        bin
        ├── bootstrap.jar
        ├── catalina.sh
        ├── ciphers.sh
        ├── commons-daemon.jar
        ├── configtest.sh
        ├── daemon.sh
        ├── digest.sh
        ├── setclasspath.sh
        ├── shutdown.sh
        ├── startup.sh
        ├── tomcat-juli.jar
        ├── tool-wrapper.sh
        └── version.sh
        └── ...
        

        apache-tomcat-8.5.35/bin 目录结构如上图所示,摘取部分主要的。进行分析: 最重要的是catalina.sh

        首先是version.sh,获取当前脚本version.sh的所在目录。然后执行同级目录下面的catalina.sh 效果等同于catalina.sh version "$@"
        其次是startup.sh,这个原理等同于上一个。相当于执行catalina start "$@"
        然后是setclasspath.sh有必要提一下,这个主要用来确保JAVA_HOME/JRE_HOME
        以及检测第一个如果为debug的话要保证 JAVA_HOME/bin目录下存在jdb,用来调试tomcat程序。以及定义变量_RUNJAVA_RUNJDB
        这个文件的使用方式是在catalina.sh中使用.dot命令在当前shell中执行内容。

        最后一个catalina.sh,使用方法如下所示:

      • 调试本地或远程的Tomcat #

        因为需要比较 源码运行,与直接本地启动tomcat后里面运行参数的异同,所以需要搭建debug环境。参考文章如下:
        https://cwiki.apache.org/confluence/display/TOMCAT/Developing
        https://stackoverflow.com/questions/16689274/how-to-start-debug-mode-from-command-prompt-for-apache-tomcat-server

        catalina.sh的 Usage 中所述,可以使用 catalina.sh debug 命令,但是这个是使用jdb程序启动的,不太会用。
        所以选用另外一种使用catalina.sh jpda start,这个使用 jdwp(Java Debug Wire Protocol) 协议,方便与现有ide结合使用 Attach模式 调试,比如 IJ idea

        使用命令启动 export JPDA_ADDRESS="12302";export JPDA_SUSPEND=y;bin/catalina.sh jpda run【此处用run而非~start~:不会再另一个shell中运行程序,而在当前窗口,方便停止与日志查看】
        参考 IDEA DEBUG 在 IDEA 端设置后连接。

    • Reference #


    comments powered by Disqus