📓 Archive

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