Java 11+ Tomcat 9+:动态添加库JAR以使其进入*每个* webapp类路径

Java 11+ Tomcat 9+:动态添加库JAR以使其进入*每个* webapp类路径

问题

如果您不知道您需要为每个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

相关推荐

合作伙伴