gpt4 book ai didi

tomcat - $ CATALINA_HOME/shared/lib是Tomcat中的真实功能吗?

转载 作者:行者123 更新时间:2023-11-28 22:10:16 26 4
gpt4 key购买 nike

Apache Tomcat中,我看到了一些引用路径$CATALINA_HOME/shared/lib的帖子。

下载Tomcat时,在Tomcat主文件夹中看不到嵌套的shared文件夹。

我确实看到了$CATALINA_HOME/lib路径,嵌套在Tomcat主文件夹中的lib文件夹。我了解这是不应在Tomcat中的“上下文”(Web应用程序)之间复制的JAR文件的适当位置。 JDBC drivers是此类的重要示例。

问题是Tomcat在$CATALINA_HOME/lib文件夹中填充了许多JAR供自己使用。因此,为使整洁和易于管理起见,最好有另一个文件夹,除了Tomcat自己的JAR以外,除了我们添加的JAR以外,什么都没有。所以我可以理解对$CATALINA_HOME/shared/lib之类的东西的需求。

问题是:


(a)我没有找到shared文件夹,
(b)我找不到有关此文件夹的任何文档。


<这是shared/lib的真实功能,是否应该在Tomcat主文件夹中嵌套创建这对文件夹?

cc $CATALINA_HOME/shared/lib是未记录的功能,也许只是将来可能会消失的黑客吗?

我要的是Tomcat 9。但是Tomcat 8仍然很常用,因此其他人也可以从中得到答案。

最佳答案

警告:我不是Tomcat专家,这个答案仅仅是我对事情如何运作的了解。我可能是错的。请纠正我。

tl; dr

是的,这是一个真实的功能。

您可以在最想要收集要在Tomcat中的一个或多个Web应用程序之间共享的JAR文件的任何位置创建一个文件夹。

diagram of class loaders in Tomcat

通过编辑catalina.properties文件来为Tomcat使用该文件夹,以将值分配给名为shared.loader的属性。

共享类加载器

您指的是Tomcat的共享加载程序功能。

如您所述,某些具有JDBC驱动程序的JAR不应在Tomcat实例中的多个Web应用程序之间分别复制。该主题已在堆栈溢出上进行discussed many times

此类JAR应该由共享的Java Class Loader而不是每个Web应用程序类的加载器加载。

几台装载机

如上图所示,Tomcat可以使用许多不同的类加载器,如explained in the doc

BootstrapSystem类装入器与此处的讨论无关。

Tomcat自己的需求使用Server类加载器。这可能包括代表您在数据库中查找与Realm相关的用户。在这种情况下,Tomcat需要将JDBC驱动程序连接到您选择的数据库。

Webapp1Webapp2的关系图中可以看出,每个Web应用程序还都具有一个类加载器。这样可以使每个网络应用保持独立,从而防止它们相互踩踏。例如,每个Web应用程序可能使用不同版本的日志记录框架。

JDBC驱动程序的窍门是它们在JVM范围内的单例DriveManager对象中共享注册表。不幸的是,JDBC团队的这种设计选择与使用各种类加载器的应用服务器(例如Tomcat)的需求相冲突。在问题Why must the JDBC driver be put in TOMCAT_HOME/lib folder?many others中对此进行了讨论。

因此,最好在Tomcat的类加载器中为每种JDBC驱动程序共享一个JAR文件。这确实意味着您的所有Web应用程序都必须使用每种JDBC驱动程序(Postgres,H2,Oracle等)的相同版本。


如果您尚未在Tomcat中启用Realm用户查找功能,则Tomcat可能没有使用它自己的数据库。因此,您可以将JDBC驱动程序放在Shared类加载器中,以在一个或多个Web应用程序中使用。
如果您已在Tomcat中启用了需要数据库的功能,则将该JDBC JAR文件放在Common类加载器中,以便在Tomcat内部和一个或多个Web应用程序中使用。


诀窍是,默认情况下,Tomcat仅专门定义Common类加载器。 Common类加载器与ServerShared类加载器一样具有双重职责。要为Server和/或Shared激活单独的类加载器,请编辑catalina.properties文件。查找server.loadershared.loader属性。

catalina.properties文件

关于文档,请参见手册中的此主页:Class Loader How-To。在Wiki页面中也提到了†。

$CATALINA_HOME/conf/catalina.properties文件中的注释中简要讨论了此问题。根据其Apache许可2条款摘录:

#
# 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=


请注意,该 shared.loader属性的默认值为空白。正如评论所解释的那样,Tomcat将回退到使用其“公共加载器”,该加载器从Catalina Home文件夹中的 lib文件夹以及Catalina Base文件夹中的 lib文件夹(某些人将其定义为文件夹位于Tomcat文件夹之外,以便于管理)。

创建并指定您自己的JAR文件夹

您可以自由指定任何文件夹来保存Tomcat通过其“共享加载器”访问的JAR文件(前提是运行Tomcat的系统用户帐户对该文件夹具有 file system privileges)。 AFAIK,创建嵌套的 shared/lib文件夹只是一种惯例。

在Tomcat文件夹中

如果要将Tomcat文件夹用于 $CATALINA_HOME/shared/lib之类的东西:


创建一对 sharedlib文件夹(具有适当的文件系统特权)。
编辑 $CATALINA_HOME/conf/catalina.properties以将 shared.loader=替换为: shared.loader="${catalina.home}/shared/lib","${catalina.home}/shared/lib/*.jar"


请注意,如何按照上面引用的注释指示使用双引号。我们为类文件指定了 lib,为JAR文件指定了 lib/*.jar

在Tomcat文件夹之外

如果您是选择将Web应用程序保留在Tomcat文件夹之外的文件夹中的人之一,则将 catalina.base定义为该外部文件夹。在这种情况下,您可能也希望将共享的JAR文件也保存在这里,而不是保存在Tomcat文件夹中。因此,您可能希望在此处创建您的 shared/lib。引用那些引用注释中的示例:


在外部文件夹中创建一对 sharedlib文件夹(具有适当的文件系统特权)。
编辑 $CATALINA_HOME/conf/catalina.properties以将 shared.loader=替换为: shared.loader="${catalina.base}/shared/lib","${catalina.base}/shared/lib/*.jar"


注意我们如何使用 catalina.base而不是 catalina.home

Tomcat文件夹的内部和外部。

您可以指定同时在Tomcat文件夹(“ home”)和Tomcat文件夹(“ base”)之外查看 /shared/lib文件夹。

同时使用 .base.home

shared.loader="${catalina.base}/shared/lib","${catalina.base}/shared/lib/*.jar","${catalina.home}/shared/lib","${catalina.home}/shared/lib/*.jar"




如果使用 Maven驱动Java项目,则需要编辑POM文件以为特定的 JDBC driver设置依赖项。在该 <dependency>元素中,您需要将 <scope>设置为值 provided,以避免将JDBC驱动程序的副本捆绑在Web应用程序的 WAR文件中。请参见 this Answer



This old Tomcat wiki page简要提到了创建 shared/lib文件夹,然后编辑 catalina.properties文件以为名为 shared.loader的属性定义值的相同技术。

关于tomcat - $ CATALINA_HOME/shared/lib是Tomcat中的真实功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com