我不确定如何命名这个问题,但我会尽量解释这个问题是什么。我目前正在测试的气氛框架在一个web应用程序。我首先阅读了文档,然后测试了多房间聊天示例。我使用tomcat 8.5在eclipse中运行它。当atmosphere servlet初始化时,它将扫描包中具有某些注释的任何类,如果找到了注释,它将使用路径作为键将类添加到映射中。要做到这一点,它必须首先扫描自己的包,寻找应该使用的注释,并将它们添加到可用注释的映射中。要初始化带注释的类,必须填充此列表。它的代码看起来像这样:
public Class<? extends Processor> handleProcessor(Class<?> clazz) {
if (Processor.class.isAssignableFrom(clazz)) {
Class<Processor> p = (Class<Processor>) clazz;
if (logger.isTraceEnabled()) {
logger.trace("Processor {} associated with {}", p, p.getAnnotation(AtmosphereAnnotation.class).value());
}
annotations.put(p.getAnnotation(AtmosphereAnnotation.class).value(), p);
return p;
}
return null;
}
所以它遍历它找到的每个类并检查它是否实现了Processor。处理器是用import org.atmosphere.annotation.Processor;
导入的大气提供的接口。然而,当我调试这段代码时,它将比较jdk的接口javax.annotation.processing.Processor而不是org.atmosphere.annotation.Processor。这将导致地图为空。这导致端点没有加载,因为没有注释要查找。
如果我下载大气代码并将其复制到我的src文件夹,它可以正常工作。
我现在正在使用Eclipse IDE,我想知道是否有一种方法可以配置项目或tomcat服务器,以某种方式使其了解应该使用哪个接口。
[EDIT]经过更多的研究,问题不是由于类比较,而是关于tomcat如何加载类。Atmosphere依赖于容器加载注释类并将其传递给Atmosphere ServletContainerInitializer,但是tomcat不会传递存在于webapps lib文件夹下的jar包文件中的类。它只会传入webapps WEB-INF/classes文件夹中的类,而不是WEB-INF/lib文件夹中的类。这就是为什么如果我将Atmosphere src添加到eclipse的webapps src文件夹中,它就会工作。
[EDIT2]原来我在catalina.properties中禁用了罐子扫描。启用jar扫描再次解决了这个问题。