问题
如果您不知道您需要为每个Tomcat they应用程序在类路径中添加哪些文件夹/JAR,那么您可以使用什么方法在Java 11+ / Tomcat 9+中将文件夹/JAR加载到类路径中,以便在每个应用程序中都可用?
以前/其他方法,以供参考:
Java 8 (Tomcat或命令行应用程序):
classloader.
Cast
获得对URLClassLoader的引用(只对命令行应用很重要,Tomcat已经是调用URLClassLoader.addUrl()的URLClassLoader).
Use反射,以绕过它是受保护的方法这一事实。
这是十多年来最常见的做法。)
Java11Tomcatwebapp-使用8方法动态添加库
这在Java11/ Tomcat 9.中仍然是暂时可行的,但它警告说,这是一种非法操作,在将来的Java版本中将被阻止。
Java 11命令行应用程序
与Tomcat无关,包括它在这里是完整的,而且该方法可能位于Tomcat解决方案的核心或部分。因此,至少理解它是件好事。super.addUrl().Instantiate 扩展了URLClassLoader,以应用程序/系统类加载器为其父,将addUrl()公开。使用这个类加载器添加应用程序中的JAR和folders.Instantiate。我为没有详细说明这一步而道歉。这是所有论坛上的共识,但我没有找到一个最佳实践,说明如何使用自定义/子类加载器以与使用默认系统类加载器一样的无思想方式实例化。在实例化对象之前,“似乎”需要使用自定义类加载器显式加载每个类。但是,这是非常不方便的,以至于它不可能是预期的方法/最佳实践。这是一个真正和相关的问题,但不是这个线程的焦点。
Java 11 Tomcat手动包含JAR/文件夹
将它们添加到Tomcat文件夹中,或者为库创建文件夹,并在catalina.properties公共类加载器列表中声明它们。此方法工作,但不是动态的。每次为其他库添加文件夹时,都必须手动更新catalina.properties.
Java11 Tomcat在webapp /lib中添加库
这是webapp中库的默认位置。库需要包含在每个webapp中。像Maven这样的工具可以帮助每个webapp,但它仍然不是一种真正的动态方法,它可以在服务器启动时自动检测库并将它们添加到classpath.
If库--库包含一个配置文件,并且配置更改,必须在每个webapp上更新,或者必须依靠手动为文件创建符号链接。
(当然不是动态的),因为它不能自动发现JAR/文件夹,必须显式和手动地包含它们。
是TOMCAT开发人员的一个想法,
如果失去向Tomcat公共类加载器动态添加JAR的能力的问题还没有得到解决,那么作为follows:
Currently,公共类加载器可能可以被消除--公共类加载器只从catalina.properties中提到的文件夹/JAR加载,就像tomcat库folder.
Expand行为,以便在catalina.properties Common中引用的文件夹导致类加载器包含文件夹、包含的JAR、以及任何子文件夹树和JAR。
因此,当我们需要动态添加文件夹/jars时,我们所要做的就是在lib下创建一个子文件夹(或更多),并将我们的内容放在其中。
,例如:
代码语言:javascript运行复制lib
lib/myOpenSourceLibs
lib/myOpenSourceLibs/apache
lib/myOpenSourceLibs/spring
lib/myOpenSourceLibs/dependencies
lib/myOrgLibraries
lib/myOrgLibraries/payrollSystemInterface
lib/myOrgLibraries/generalLedgerSystemInterface