• Tomcat:多个应用程序共享JAR


    不同项目开发时,其基础的组件很可能是一样的,例如springboot,数据库连接池,驱动等等。如果把这些相同的JAR在tomcat中共享,这样既可以节约内存,也可以减少

    各应用的大小。

    我用的是Tomcat9,各版本差别不大。

    具体做法:

    1.catalina.properties

    蓝色部分就是需要修改的部分

    # Licensed to the Apache Software Foundation (ASF) under one or more
    # contributor license agreements.  See the NOTICE file distributed with
    # this work for additional information regarding copyright ownership.
    # The ASF licenses this file to You under the Apache License, Version 2.0
    # (the "License"); you may not use this file except in compliance with
    # the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    #
    # List of comma-separated packages that start with or equal this string
    # will cause a security exception to be thrown when
    # passed to checkPackageAccess unless the
    # corresponding RuntimePermission ("accessClassInPackage."+package) has
    # been granted.
    package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat.
    #
    # List of comma-separated packages that start with or equal this string
    # will cause a security exception to be thrown when
    # passed to checkPackageDefinition unless the
    # corresponding RuntimePermission ("defineClassInPackage."+package) has
    # been granted.
    #
    # by default, no packages are restricted for definition, and none of
    # the class loaders supplied with the JDK call checkPackageDefinition.
    #
    package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,
    org.apache.jasper.,org.apache.naming.,org.apache.tomcat.
    
    #
    #
    # List of comma-separated paths defining the contents of the "common"
    # classloader. Prefixes should be used to define what is the repository type.
    # Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
    # If left as blank,the JVM system loader will be used as Catalina's "common"
    # loader.
    # Examples:
    #     "foo": Add this folder as a class repository
    #     "foo/*.jar": Add all the JARs of the specified folder as class
    #                  repositories
    #     "foo/bar.jar": Add bar.jar as a class repository
    #
    # Note: Values are enclosed in double quotes ("...") in case either the
    #       ${catalina.base} path or the ${catalina.home} path contains a comma.
    #       Because double quotes are used for quoting, the double quote character
    #       may not appear in a path.
    common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar","${catalina.base}/shared/lib","${catalina.base}/shared/lib/*.jar"
    
    #
    # List of comma-separated paths defining the contents of the "server"
    # classloader. Prefixes should be used to define what is the repository type.
    # Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
    # If left as blank, the "common" loader will be used as Catalina's "server"
    # loader.
    # Examples:
    #     "foo": Add this folder as a class repository
    #     "foo/*.jar": Add all the JARs of the specified folder as class
    #                  repositories
    #     "foo/bar.jar": Add bar.jar as a class repository
    #
    # Note: Values may be enclosed in double quotes ("...") in case either the
    #       ${catalina.base} path or the ${catalina.home} path contains a comma.
    #       Because double quotes are used for quoting, the double quote character
    #       may not appear in a path.
    server.loader=
    
    #
    # List of comma-separated paths defining the contents of the "shared"
    # classloader. Prefixes should be used to define what is the repository type.
    # Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
    # the "common" loader will be used as Catalina's "shared" loader.
    # Examples:
    #     "foo": Add this folder as a class repository
    #     "foo/*.jar": Add all the JARs of the specified folder as class
    #                  repositories
    #     "foo/bar.jar": Add bar.jar as a class repository
    # Please note that for single jars, e.g. bar.jar, you need the URL form
    # starting with file:.
    #
    # Note: Values may be enclosed in double quotes ("...") in case either the
    #       ${catalina.base} path or the ${catalina.home} path contains a comma.
    #       Because double quotes are used for quoting, the double quote character
    #       may not appear in a path.
    shared.loader="${catalina.base}/shared/lib","${catalina.base}/shared/lib/*.jar"
    
    # Default list of JAR files that should not be scanned using the JarScanner
    # functionality. This is typically used to scan JARs for configuration
    # information. JARs that do not contain such information may be excluded from
    # the scan to speed up the scanning process. This is the default list. JARs on
    # this list are excluded from all scans. The list must be a comma separated list
    # of JAR file names.
    # The list of JARs to skip may be over-ridden at a Context level for individual
    # scan types by configuring a JarScanner with a nested JarScanFilter.
    # The JARs listed below include:
    # - Tomcat Bootstrap JARs
    # - Tomcat API JARs
    # - Catalina JARs
    # - Jasper JARs
    # - Tomcat JARs
    # - Common non-Tomcat JARs
    # - Test JARs (JUnit, Cobertura and dependencies)
    tomcat.util.scan.StandardJarScanFilter.jarsToSkip=
    annotations-api.jar,
    ant-junit*.jar,
    ant-launcher.jar,
    ant.jar,
    asm-*.jar,
    aspectj*.jar,
    bootstrap.jar,
    catalina-ant.jar,
    catalina-ha.jar,
    catalina-ssi.jar,
    catalina-storeconfig.jar,
    catalina-tribes.jar,
    catalina.jar,
    cglib-*.jar,
    cobertura-*.jar,
    commons-beanutils*.jar,
    commons-codec*.jar,
    commons-collections*.jar,
    commons-daemon.jar,
    commons-dbcp*.jar,
    commons-digester*.jar,
    commons-fileupload*.jar,
    commons-httpclient*.jar,
    commons-io*.jar,
    commons-lang*.jar,
    commons-logging*.jar,
    commons-math*.jar,
    commons-pool*.jar,
    dom4j-*.jar,
    easymock-*.jar,
    ecj-*.jar,
    el-api.jar,
    geronimo-spec-jaxrpc*.jar,
    h2*.jar,
    hamcrest-*.jar,
    hibernate*.jar,
    httpclient*.jar,
    icu4j-*.jar,
    jasper-el.jar,
    jasper.jar,
    jaspic-api.jar,
    jaxb-*.jar,
    jaxen-*.jar,
    jdom-*.jar,
    jetty-*.jar,
    jmx-tools.jar,
    jmx.jar,
    jsp-api.jar,
    jstl.jar,
    jta*.jar,
    junit-*.jar,
    junit.jar,
    log4j*.jar,
    mail*.jar,
    objenesis-*.jar,
    oraclepki.jar,
    oro-*.jar,
    servlet-api-*.jar,
    servlet-api.jar,
    slf4j*.jar,
    taglibs-standard-spec-*.jar,
    tagsoup-*.jar,
    tomcat-api.jar,
    tomcat-coyote.jar,
    tomcat-dbcp.jar,
    tomcat-i18n-*.jar,
    tomcat-jdbc.jar,
    tomcat-jni.jar,
    tomcat-juli-adapters.jar,
    tomcat-juli.jar,
    tomcat-util-scan.jar,
    tomcat-util.jar,
    tomcat-websocket.jar,
    tools.jar,
    websocket-api.jar,
    wsdl4j*.jar,
    xercesImpl.jar,
    xml-apis.jar,
    xmlParserAPIs-*.jar,
    xmlParserAPIs.jar,
    xom-*.jar
    
    # Default list of JAR files that should be scanned that overrides the default
    # jarsToSkip list above. This is typically used to include a specific JAR that
    # has been excluded by a broad file name pattern in the jarsToSkip list.
    # The list of JARs to scan may be over-ridden at a Context level for individual
    # scan types by configuring a JarScanner with a nested JarScanFilter.
    tomcat.util.scan.StandardJarScanFilter.jarsToScan=
    log4j-taglib*.jar,
    log4j-web*.jar,
    log4javascript*.jar,
    slf4j-taglib*.jar
    
    # String cache configuration.
    tomcat.util.buf.StringCache.byte.enabled=true
    #tomcat.util.buf.StringCache.char.enabled=true
    #tomcat.util.buf.StringCache.trainThreshold=500000
    #tomcat.util.buf.StringCache.cacheSize=5000

    2.建立shared/lib 这两个目录

    image

    3.把共享的jar放入shared/lib中.


    注意:共享jar虽然带来的性能的提升,但是也会引发其他问题,例如redis缓存读取时发生类型转换错误,只有一个项目访问redis是没有问题的,其它的不行。还有logback日志输出,也只有一个项目生成日志。


  • 相关阅读:
    编译原理-确定有穷自动机(deterministic finite automata ,DFA)
    编译原理-正规式和正规集
    linux之sed用法
    Linux 中find命令
    运维工作应该掌握哪些技能?
    Last_SQL_Error: Error 'Can't drop database
    关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法
    python3.7安装, 解决pip is configured with locations that require TLS/SSL问题
    Linux date命令的用法(转)
    MySQL回滚到某一时刻数据的方法
  • 原文地址:https://www.cnblogs.com/huiy/p/12454175.html
Copyright © 2020-2023  润新知