java - Tomcat(没有热部署)可以忽略覆盖的jar吗

标签 java tomcat classloader hotdeploy tomcat8.5

我们正在使用 Tomcat 8.5 没有任何热部署

我假设类已加载到内存中,例如,如果 jar 中的类更改,它将忽略(不是热部署)

但是如果我们在应用程序运行时覆盖一个 jar,它会覆盖类(或删除它)

例如,当我复制空 jar 时,它会为 jar 中的类抛出 ZipException:

java.lang.IllegalStateException: java.util.zip.ZipException: zip file is empty
        at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getArchiveEntry(AbstractSingleArchiveResourceSet.java:97)
        at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:260)
        at org.apache.catalina.webresources.StandardRoot.getResourcesInternal(StandardRoot.java:327)
        at org.apache.catalina.webresources.CachedResource.validateResources(CachedResource.java:127)
        at org.apache.catalina.webresources.Cache.getResources(Cache.java:147)
        at org.apache.catalina.webresources.StandardRoot.getResources(StandardRoot.java:315)
        at org.apache.catalina.webresources.StandardRoot.getClassLoaderResources(StandardRoot.java:231)
        at org.apache.catalina.loader.WebappClassLoaderBase.findResources(WebappClassLoaderBase.java:939)
        at java.lang.ClassLoader.getResources(ClassLoader.java:1142)
        at java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:348)
        at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:393)
        at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474)
        at javax.xml.parsers.FactoryFinder$1.run(FactoryFinder.java:293)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.xml.parsers.FactoryFinder.findServiceProvider(FactoryFinder.java:289)
        at javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:267)
        at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:120)
        at com.MyHelper.createDoc(MyHelper.java:64)

tomcat 可以忽略覆盖的 jar 并仅从内存中提取类吗?

是否有某种我不知道的内置热部署?

编辑

这可能与打开空 jar 的 tomcat 特有的问题有关

最佳答案

我认为正在发生的事情是类加载器或 JAR 文件读取器正在读取和缓存 JAR 文件的索引。因此,如果您在类加载器仍处于打开状态时替换 JAR 文件,然后尝试加载资源,则很可能会注意到该文件现在是空的。

It may be related to issue specific for tomcat with empty jar opening

没有。它更基本。标准的 Java 类加载器并不是为应对 JAR 文件的变化而设计的。

Can Tomcat ignore overridden jar and pull classes from memory only ?

据我所知

但是您也许能够实现自己的自定义类加载器来执行类似的操作;例如

  • 将 JAR 文件读入字节数组,然后针对字节数组打开 JAR 文件阅读器。
  • 将 JAR 文件复制到另一个文件,用 JAR 文件阅读器打开第二个文件,然后(可选)取消链接副本,这样就没有其他东西可以干扰它。 (最后一步不适用于 Windows ...)

关于java - Tomcat(没有热部署)可以忽略覆盖的jar吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073843/

相关文章:

java - 这个 SQL 语法有什么问题?

java - 无法修改 Web API/Java Web App 中的对象

java - 从扩展实现中解耦抽象类细节

java - 如何将一个类注入(inject)到java.lang包中

java - 使用 Groovy 作为脚本语言

Java当前目录返回 `null`

java - Java中的ResultSet到整数数组

java - 读取 HTTPServletRequest 的 POST 主体,然后在 Tomcat 中调用 getParameter

java - webapp 内的自定义类加载器、JSP 执行和资源检索

java - 动态显示图像