0

我不确定如何命名这个问题,但我会尝试解释问题所在。我目前正在 Web 应用程序中测试Atmosphere 框架。我首先阅读了文档,然后测试了chat-multiroom 示例。我使用tomcat 8.5在eclipse中运行它。当大气 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;
    }

所以它会遍历它找到的每个类并检查它是否实现了处理器。处理器是大气提供的接口import org.atmosphere.annotation.Processor;

但是,当我调试此代码时,它会将 clazz 与 jdk:s 接口 javax.annotation.processing.Processor 而不是 org.atmosphere.annotation.Processor 进行比较。这导致地图为空。这会导致未加载端点,因为没有要查找的注释。

如果我下载气氛代码并将其复制到我的 src 文件夹中,它可以正常工作。

我目前正在使用 Eclipse IDE,我想知道是否有办法以某种方式配置项目或 tomcat 服务器以使其了解应该使用哪个接口。

4

1 回答 1

0

[编辑] 经过更多研究后,问题不是由于类比较,而是关于 tomcat 如何加载类。Atmosphere 依赖于容器加载注释类并将其传递给 Atmosphere ServletContainerInitializer,但是 tomcat 不会传递 webapps lib 文件夹下的包 jar 文件中存在的类。它只会传入 webapps WEB-INF/classes 文件夹中的类,而不是 WEB-INF/lib 文件夹中的类。这就是为什么我将 Atmosphere src 添加到 eclipse 中的 webapps src 文件夹中的原因。

[EDIT2] 原来我在 catalina.properties 中禁用了 jar 扫描。再次启用 jar 扫描解决了这个问题。

于 2021-08-04T15:32:01.057 回答