我们使用的是Tomcat8.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并只从内存中提取类吗?
有没有什么我不知道的内置热部署?
编辑
这可能与空罐打开的tomcat特有的问题有关。
发布于 2019-07-24 11:45:31
我认为所发生的事情是类加载程序或JAR文件读取器正在读取和缓存JAR文件的索引。因此,如果在类加载器仍然打开时替换JAR文件,然后尝试加载资源,则应该注意文件现在是空的。
这可能与空罐打开的tomcat特有的问题有关。
不是的。它是更基本的。标准的Java类加载器不是针对JAR文件更改而设计的。
Tomcat可以忽略重写的jar并只从内存中提取类吗?
AFAIK不。
但是您可能能够实现您自己的自定义类加载器,它可以执行类似的操作。
https://stackoverflow.com/questions/57073843
复制相似问题