在Apache Tomcat中,我看到了一些引用路径$CATALINA_HOME/shared/lib
的帖子。
[下载Tomcat时,我看不到Tomcat主文件夹中嵌套的shared
文件夹。
我确实看到一个$CATALINA_HOME/lib
路径,一个嵌套在Tomcat主文件夹中的lib
文件夹。我了解这是不应在Tomcat中的“上下文”(Web应用程序)之间复制的JAR文件的适当位置。 JDBC drivers是这种情况的重要示例。
问题是,Tomcat用许多JAR填充了$CATALINA_HOME/lib
文件夹以供自己使用。因此,为使整洁和易于管理起见,最好有另一个文件夹,除了Tomcat自己的JAR之外,除了我们添加的JAR之外,什么都没有。因此,我可以理解对$CATALINA_HOME/shared/lib
之类的东西的需求。
问题是:
shared
文件夹,➥这是shared/lib
的真实功能,并且我应该创建这对文件夹嵌套在Tomcat主文件夹中吗?
➥$CATALINA_HOME/shared/lib
是未公开的功能,也许只是将来更新中可能会消失的黑客?
我专门要求Tomcat 9。但是Tomcat 8仍然很常用,因此其他人也可以从中得到答案。
是的,这是一个真实的功能。
您可以在最想要收集要在Tomcat内的一个或多个Web应用程序之间共享的JAR文件的任何位置创建一个文件夹。
通过编辑catalina.properties
文件使Tomcat使用该文件夹,以将值分配给名为shared.loader
的属性。
您指的是Tomcat的shared loader功能。
正如您提到的,某些具有JDBC驱动程序的JAR不应在Tomcat实例中的多个Web应用程序之间分别复制。该主题已在堆栈溢出上discussed many times。
此类JAR应该由共享的Java Class Loader加载,而不是按Web应用程序类加载器加载。
catalina.properties
文件我不了解Tomcat的主要文档†。但是,此问题在$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通过其“共享加载程序”进行访问(前提是运行Tomcat的系统用户帐户具有该文件夹的file system privileges)。 AFAIK,创建嵌套的shared/lib
文件夹只是惯例。
如果您想将Tomcat文件夹用于$CATALINA_HOME/shared/lib
:
shared
和lib
文件夹对(具有适当的文件系统特权)。 $CATALINA_HOME/conf/catalina.properties
以将shared.loader=
替换为:shared.loader="${catalina.home}/shared/lib","${catalina.home}/shared/lib/*.jar"
请注意,我们如何按照上述引用的说明使用双引号。对于类文件,我们只指定了lib
;对于JAR文件,我们只指定了lib/*.jar
。
如果您是选择将Web应用程序保存在Tomcat文件夹的文件夹[[outside中的人之一,则您将catalina.base
定义为该外部文件夹。在这种情况下,您可能也希望将共享的JAR文件也保存在这里,而不是保存在Tomcat文件夹中。因此,您可能希望在此处创建您的shared/lib
。引用那些引用注释中的示例:
shared
和lib
文件夹(具有适当的文件系统特权)。 $CATALINA_HOME/conf/catalina.properties
以将shared.loader=
替换为:shared.loader="${catalina.base}/shared/lib","${catalina.base}/shared/lib/*.jar"
catalina.base
而不是catalina.home
。 都在Tomcat文件夹之外的
/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驱动程序的副本捆绑在网络应用的WAR文件中。参见this Answer。† This old Tomcat wiki page简要提到了创建
shared/lib
文件夹,然后编辑catalina.properties
文件以为名为shared.loader
的属性定义值的相同技术。