【问题标题】:Will tomcat loads two instances if two classes of the same package exists in classpaths如果类路径中存在同一个包的两个类,tomcat会加载两个实例
【发布时间】:2020-10-20 11:34:07
【问题描述】:

在我们的一个生产环境中,我们有一个混乱的结构, tomcat WEB-INF 有带有配置的 ../classes 和带有 jar 的 ../lib。

我们发现classes目录有一个如下包结构的目录, 示例:

com/test/A.class

在 lib 目录中,我们还打包了另一个具有相同类的 jar。

当我们发现正在发生重复处理时,我们调查了真正的问题,但不确定问题是否是因为这个。

实际的问题是,tomcat 启动时会创建同一个类的两个实例并进行并行处理吗?是否有可能,因为类目录和 lib 目录都在类路径中。

【问题讨论】:

  • 取决于使用的 ClassLoader。每个 ClassLoader 的一个完全限定类名是唯一的。是的,理论上你可以在一个应用程序中多次加载“com.example.Foo”

标签: java tomcat web-applications classpath


【解决方案1】:

这不是关于 tomcat,而是关于类加载器。层次结构是 BootstrapLoader(rt.jar)->ExtensionClassLoader(java.ext.dir location)->ApplicationClassLoader(来自 application -classpath 参数)。 因此,如果该类被更高层次结构的任何加载器加载,它将不会从任何其他 jar 再次加载。 如果你想从一个特定的 jar 加载一个类而不改变类加载顺序,请参考How to load Classes at runtime from a folder or JAR?

【讨论】:

  • 如果没有自定义,我们使用tomcat作为原版,有没有可能被多次加载?
  • 只有当类在应用加载器中并且在tomcat中有多个应用时才有可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2019-09-29
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多