【问题标题】:Can Tomcat (without hot deploy) ignore overridden jarTomcat(没有热部署)可以忽略覆盖的jar吗
【发布时间】:2019-11-26 04:03:27
【问题描述】:

我们使用的是 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 的特定问题有关

【问题讨论】:

    标签: java tomcat classloader hotdeploy tomcat8.5


    【解决方案1】:

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

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

    没有。它更为根本。标准的 Java 类加载器无法应对 JAR 文件的变化。

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

    AFAIK 编号

    但是你也许可以实现你自己的自定义类加载器来做类似的事情;例如

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多