Tomcat的catalina.properties配置⽂件说明及使⽤配置⽂件处理异常
说明:
Tomcat的catalina.properties⽂件位于%CATALINA_HOME%/conf/⽬录下⾯,该⽂件主要配置tomcat的安全设置、类加载设置、不需要扫描的类设置、字符缓存设置四⼤块。本⽂介绍主要以 tomcat-9.0.33为例,其他版本类似。
官⽅⽂档:
使⽤这个配置⽂件的类CatalinaProperties。
这个类就是⼀个属性获取的公共类。它的功能是管理catalina.properties类⽂件中的配置属性获取,只有⼀个⽅法getPropertity(String name).类图和流程图如下:
⼀、⽂件内容组成
catalina.properties中的设置项包括四个部分:
第⼀部分:安全设置
package.access
package.definition
第⼆部分:类加载设置
common.loader
server.loader
shared.loader
第三部分:忽略扫描和需要扫描类设置
tomcat.util.scan.DefaultJarScanner.jarsToSkip #不需要扫描
tomcat.util.scan.StandardJarScanFilter.jarsToScan #需要扫描
第四部分:字符缓存设置
tomcat.util.buf.abled
tomcat.util.buf.abled
tomcat.util.ainThreshold
tomcat.util.buf.StringCache.cacheSize
1、安全设置
Java SecurityManager允许Web浏览器在其⾃⼰的沙箱中运⾏⼩程序,以防⽌不受信任的代码访问本地⽂件系统上的⽂件,连接到未加载⼩程序的主机等。以与SecurityManager保护您免受浏览器中运⾏的不受信任⼩程序相同的⽅式,在运⾏Tomcat时使⽤SecurityManager可以保护您的服务器免受特洛伊⽊马servlet,JSP,JSP Bean和标记库的侵害。甚⾄是⽆⼼的错误。
想象⼀下,如果某⼈被授权在您的站点上发布JSP,则⽆意中将以下内容包括在其JSP中:
<% it(1); %>
Tomcat每次执⾏此JSP时,Tomcat都会退出。使⽤Java SecurityManager只是系统管理员可以⽤来保持服务器安全可靠的另⼀道防线。catalina.properties⽂件中关于安全的设置
package.access=sun.,org.apache.catalina.,,at.,org.apache.jasper.,sun.beans.
package.definition=sun.,java.,org.apache.catalina.,,at.,org.apache.jasper.
具体请查阅官⽅⽂档 :
.
2、类加载设置
类加载器的使⽤⽅法
像许多服务器应⽤程序⼀样,Tomcat安装了各种类加载器(即实现的类java.lang.ClassLoader),以允许容器的不同部分以及容器上运⾏的Web应⽤程序可以访问可⽤类和资源的不同存储库。该机制⽤于提供Servlet规范2.4版中定义的功能-特别是9.4和9.6节。
在Java环境中,类加载器排列在⽗⼦树中。通常,当要求类加载器加载特定的类或资源时,它⾸先将
请求委派给⽗类加载器,然后仅在⽗类加载器不到所请求的类或资源时才在其⾃⼰的存储库中查。请注意,Web应⽤程序类加载器的模型与此略有不同,如下所述,但是主要原理是相同的。
Tomcat启动时,它将创建⼀组类加载器,这些类加载器被组织为以下⽗⼦关系,其中⽗类加载器位于⼦类加载器之上:
Bootstrap
|
System
|
Common
/ \
小程序代码怎么写Webapp1 Webapp2 ...
具体请查阅官⽅⽂档 :
1、类加载器定义
如上图所⽰,Tomcat在初始化时会创建以下类加载器:
引导程序 -该类加载器包含Java虚拟机提供的基本运⾏时类,以及系统扩展⽬录($JAVA_HOME/jre/lib/ext)中存在的JAR⽂件中的所有类。 注意:某些JVM可能将其实现为多个类加载器,或者根本不可见(作为类加载器)。
系统 -通常从CLASSPATH环境变量的内容初始化该类加载器。所有这些类对于Tomcat内部类和Web应⽤程序都是可见的。但是,标准Tomcat启动脚本($CATALINA_HOME/bin/catalina.sh或 %CATALINA_HOME%\bin\catalina.bat)完全忽略CLASSPATH环境变量本⾝的内容,⽽是从以下存储库构建System类加载器:
$ CATALINA_HOME / bin / bootstrap.jar —包含⽤于初始化Tomcat服务器的main()⽅法,以及它依赖的类加载器实现类。
$ CATALINA_BASE / bin / tomcat-juli.jar或 $ CATALINA_HOME / bin / tomcat-juli.jar —记录实现类。其中包括对
java.util.loggingAPI的增强类 ,称为Tomcat JULI,以及由Tomcat内部使⽤的Apache Commons Loggi
ng库的程序包重命名副本。有关更多详细信息,请参见⽇志记录⽂档。
如果tomcat-juli.jar是出现在 $ CATALINA_BASE / bin中,它被⽤来代替⼀个在 $ CATALINA_HOME / bin中。在某些⽇志记录配置中很有⽤
$ CATALINA_HOME / bin / commons-daemon.jar — Apache Commons Daemon项⽬中的类。此JAR⽂件在| CLASSPATH创建者 catalina.bat|中不存在。.sh脚本,但从bootstrap.jar的清单⽂件引⽤。
通⽤ -该类加载器包含对Tomcat内部类和所有Web应⽤程序都可见的其他类。
通常情况下,应⽤类应该不 放在这⾥。此类加载器搜索的位置由common.loader$ CATALINA_BASE / conf / catalina.properties中的属性定义。默认设置将按列出的顺序搜索以下位置:
无限电影在线观看播放解压后的类和资源 $CATALINA_BASE/lib
JAR⽂件 $CATALINA_BASE/lib
解压后的类和资源 $CATALINA_HOME/lib
JAR⽂件 $CATALINA_HOME/lib
默认情况下,这包括以下内容:
数据库连接工具排行注解-api.jar — JavaEE注解类。
catalina.jar — Tomcat的Catalina servlet容器部分的实现。
catalina-ant.jar — Tomcat Catalina Ant任务。
catalina-ha.jar —⾼可⽤性软件包。
catalina-ssi.jar —服务器端包含模块。
catalina-storeconfig.jar —从当前状态⽣成XML配置⽂件
catalina-tribes.jar —组通信程序包。
ecj-*。jar — Eclipse JDT Java编译器。
el-api.jar — EL 3.0 API。
jasper.jar — Tomcat Jasper JSP编译器和运⾏时。
jasper-el.jar — Tomcat Jasper EL实现。
jsp-api.jar — JSP 2.3 API。
servlet-api.jar — Servlet 4.0 API。
tomcat-api.jar — Tomcat定义的⼏个接⼝。
tomcat-coyote.jar -Tomcat连接器和实⽤程序类。
tomcat-dbcp.jar —基于程序包重命名的Apache Commons Pool 2和Apache Commons DBCP 2的数据库连接池实现。
tomcat-i18n-**。jar —包含其他语⾔资源包的可选JAR。由于默认捆绑包还包含在每个单独的JAR中,因此如果不需要消息的国际化,可以安全地删除它们。tomcat-jdbc.jar —⼀种替代的数据库连接池实现,称为Tomcat JDBC池。有关更多详细信息,请参见⽂档。
tomcat-util.jar -Apache Tomcat的各种组件使⽤的通⽤类。
tomcat-websocket.jar — WebSocket 1.1的实现
websocket-api.jar — WebSocket 1.1 API
WebappX —为部署在单个Tomcat实例中的每个Web应⽤程序创建⼀个类加载器。/WEB-INF/classesWeb应⽤程序⽬录中的所有解压缩类和资源,以及Web应⽤程序/WEB-INF/lib⽬录下的JAR⽂件中的类和资源,对于此Web应⽤程序均可见,但对其他Web应⽤程序不可见。
如上所述,Web应⽤程序类加载器不同于默认的Java委托模型(根据Servlet规范2.4版的建议,第9.7.2节Web应⽤程序类加载器)。当处理从Web应⽤程序的WebappX类加载器加载类的请求时,该类加载器将⾸先在本地存储库中查,⽽不是在看前委派。也有例外。属于JRE基类的类不能被覆盖。有⼀些例外,例如可以使⽤适当的JVM功能覆盖XML解析器组件,JVM功能是Java <= 8的认可标准重写功能,⽽Java 9+是可升级的模块功能。最后,对于由Tomcat(Servlet,JSP,EL,WebSocket)实现的规范,Web应⽤程序类加载器将始终⾸先委托JavaEE API类。Tomcat中的所有其他类装⼊器都遵循通常的委托模式。
因此,从Web应⽤程序的⾓度来看,类或资源的加载按以下顺序查以下存储库:
JVM的Bootstrap类
/ WEB-INF /您的⽹络应⽤程序类
Web应⽤程序的/WEB-INF/lib/*.jar
系统类加载器类(如上所述)
通⽤类加载器类(如上所述)
如果使⽤了Web应⽤程序类加载器 , 在Tomcat配置⽂件l中,那么顺序将变为:
JVM的Bootstrap类
系统类加载器类(如上所述)
通⽤类加载器类(如上所述)
/ WEB-INF /您的⽹络应⽤程序类
Web应⽤程序的/WEB-INF/lib/*.jar
Common的配置是通过 catalina.properties中的common.loader设置的。
2、common.loader设置
通常情况下,common.loader是已经设置好的,不需要修改。
common.loader包括以下路径:
unpacked classes and resources in $CATALINA_BASE/lib
properties文件用什么打开JAR files in $CATALINA_BASE/lib
unpacked classes and resources in $CATALINA_HOME/lib
JAR files in $CATALINA_HOME/lib
Tomcat可以通过catalina.properties的server和shared设置,为webapp提供公⽤类库。
使⼀些公⽤的、不需要与webapp放在⼀起的设置信息单独保存,在更新webapp的war的时候⽆需更改webapp的设置。
通⽤ -该类加载器包含使Tomcat内部类和所有Web应⽤程序都可见的其他类。
通常情况下,应⽤类应该不 放在这⾥。此类加载器搜索的位置由common.loader在$ CATALINA_BASE / conf / catalina.properties中的属性定义。默认设置将按照列出的顺序搜索以下位
置:
解压后的类和资源 $CATALINA_BASE/lib
JAR⽂件 $CATALINA_BASE/lib
解压后的类和资源 $CATALINA_HOME/lib
JAR⽂件 $CATALINA_HOME/lib
默认情况下,这包括以下内容:
amaze ui 等比例annotations-api.jar — JavaEE注解类。
catalina.jar — Tomcat的Catalina servlet容器部分的实现。
catalina-ant.jar — Tomcat Catalina Ant任务。
catalina-ha.jar —⾼可⽤性软件包。
catalina-ssi.jar —服务器端包含模块。
catalina-storeconfig.jar —从当前状态⽣成XML配置⽂件
catalina-tribes.jar —组通信程序包。
ecj-*。jar — Eclipse JDT Java编译器。
el-api.jar — EL 3.0 API。
jasper.jar — Tomcat Jasper JSP编译器和运⾏时。
jasper-el.jar — Tomcat Jasper EL实现。
下拉框怎么设置的jsp-api.jar — JSP 2.3 API。
servlet-api.jar — Servlet 4.0 API。
tomcat-api.jar — Tomcat定义的⼏个接⼝。
tomcat-coyote.jar — Tomcat连接器和实⽤程序类。
tomcat-dbcp.jar —基于Apache Commons Pool 2和Apache Commons DBCP 2的程序包重命名副本的数据库连接池实现。
tomcat-i18n-**。 jar-包含其他语⾔资源包的可选JAR。由于默认捆绑包还包含在每个单独的JAR中,因此如果不需要消息的国际化,可以安全地删除它们。tomcat-jdbc.jar —⼀种替代的数据库连接池实现,称为Tomcat JDBC池。有关更多详细信息,请参见⽂档。
tomcat-util.jar -Apache Tomcat的各种组件使⽤的通⽤类。
tomcat-websocket.jar — WebSocket 1.1的实现
websocket-api.jar — WebSocket 1.1 API
这些都是系统和⼯具类,⽐如数据库的驱动类库、log 类库可以放到此处,web应⽤的jar 不要放到common.loader 中。
3、server.loader 和 shared.loader
在common.loader 加载完后,tomcat启动程序会检查 catalina.properties⽂件中配置的server.loader和shared.loader是否设置
如果设置,读取 tomcat下对应的server和shared这两个⽬录的类库。
server和shared是对应tomcat⽬录下的两个⽬录,默认的Tomcat下这两个属性是没有配置值的。
设置⽅法:
server.loader=${catalina.base}/server/classes,${catalina.base}/server/lib/*.jar
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
同时需要在tomcat⽬录下创建 server和shared⽬录结构并将公⽤的、应⽤类放到⾥⾯。
Bootstrap—>System—>/WEB-INF/classes—> /WEB-INF/lib/*.jar—> Common—>Server—>Shared
3、忽略扫描和需要扫描类设置
配置⽂件中默认的⼀些类tomcat已经设置。
如果有jar包冲突的可以这个中添加忽略
tomcat.util.scan.DefaultJarScanner.jarsToSkip
如果有jar包需要扫描可以在中添加
tomcat.util.scan.StandardJarScanFilter.jarsToScan
官⽅⽂档:
4、字符缓存设置
根据需要设置字符的缓存策略。
默认设置
tomcat.util.buf.abled=true
#tomcat.util.buf.abled=true
#tomcat.util.ainThreshold=500000
#tomcat.util.buf.StringCache.cacheSize=5000
5、⼩结
Tomcat可以通过catalina.properties的server和shared设置,为webapp提供公⽤类库。
使⼀些公⽤的、不需要与webapp放在⼀起的设置信息单独保存,在更新webapp的war的时候⽆需更改webapp的设置。
Tomcat 遵循的规范如下:
EL 2.2 API.
JSP 2.2 API.
Servlet 3.0 API
⼆、Tomcat启动抛出异常java.lang.IllegalStateException:…too low setting for -Xss…
具体异常信息:
...
Caused by: java.lang.IllegalStateException:
Unable to complete the scan for annotations for web application [/xxx-xxx] due to a StackOverflowError.
Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle .asn1.ASN1EncodableVector]
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2186)
...
根据其中的异常信息是线程栈空间被耗尽,需要调整Xss参数,
线程栈的默认⼤⼩依赖于操作系统、JVM 版本和供应商,
Sparc 64-bit JVM默认为1024 kb。
但真正的问题不是出在这⾥,继续查看错误信息:[org.bouncycastle.asn1.ASN1EncodableVector-
>org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector],这个是重点,因为tomcat启动会去扫描jar包,所以ASN1EncodableVector和DEREncodableVector的bcprov-*. jar包下产⽣了循环继承,所以形成死循环,造成内存溢出,所以问题就出在了jar版本冲突上
这个类出现在bcprov-*.jar(bcprov-jdk15on-1.5.3.jar或其他版本)这个jar包中。
处理⽅法1
在tomcat的conf⽬录⾥⾯catalina.properties的⽂件,
在tomcat.util.scan.DefaultJarScanner.jarsToSkip中添加bcprov-*.jar的过滤就可以解决了,*代表版本。
处理⽅法2
改为同⼀版本,例如都使⽤bcprov-jdk15on-1.5.3.jar或其他版本
三、catalina.home与 catalina.base区别
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论