首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat (没有热部署)可以忽略重写的jar吗?

Tomcat (没有热部署)可以忽略重写的jar吗?
EN

Stack Overflow用户
提问于 2019-07-17 10:33:15
回答 1查看 205关注 0票数 0

我们使用的是Tomcat8.5,没有任何热部署

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

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

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

代码语言:javascript
复制
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并只从内存中提取类吗?

有没有什么我不知道的内置热部署?

编辑

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-24 11:45:31

我认为所发生的事情是类加载程序或JAR文件读取器正在读取和缓存JAR文件的索引。因此,如果在类加载器仍然打开时替换JAR文件,然后尝试加载资源,则应该注意文件现在是空的。

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

不是的。它是更基本的。标准的Java类加载器不是针对JAR文件更改而设计的。

Tomcat可以忽略重写的jar并只从内存中提取类吗?

AFAIK不。

但是您可能能够实现您自己的自定义类加载器,它可以执行类似的操作。

  • 将JAR文件读入字节数组,然后针对字节数组打开JAR文件读取器。
  • 将JAR文件复制到另一个文件,用JAR文件读取器打开第二个文件,然后(可选地)取消该副本的链接,这样其他文件就不会干扰它。(最后一步不适用于Windows .)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57073843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档