Jetty AnnotationParser 从多个位置扫描警告

如何解决Jetty AnnotationParser 从多个位置扫描警告

我有一个使用 Gradle 构建的项目,它实际上是一个 Vaadin 项目,带有一个我使用 Jetty 的 servlet。 在启动(即运行 gradle)时,我收到了很多来自 AnnotationParser 的关于类重复的不同警告消息。我只复制一份,因为日志很冗长:

[INFO ] 11:22:50.375 org.eclipse.jetty.server.Server.doStart() - jetty-9.4.31.v20200723; built: 2020-07-23T17:57:36.812Z; git: 450ba27947e13e66baa8cd1ce7e85a4461cacc1d; jvm 13.0.2+8
[WARN ] 11:22:50.777 org.eclipse.jetty.annotations.AnnotationParser.addParsedClass() - javax.websocket.ClientEndpoint scanned from multiple locations: jar:file:///Users/fox/.gradle/caches/modules-2/files-2.1/javax.websocket/javax.websocket-api/1.0/fc843b649d4a1dcb0497669d262befa3918c7ba8/javax.websocket-api-1.0.jar!/javax/websocket/ClientEndpoint.class,jar:file:///Users/fox/.gradle/caches/modules-2/files-2.1/javax.websocket/javax.websocket-client-api/1.0/afcf19e889d8725576811f8d47ab6c65d9dcbd78/javax.websocket-client-api-1.0.jar!/javax/websocket/ClientEndpoint.class

在这一行中,AnnotationParser 警告我 ClientEndpoint.class 存在于两个 jar 中,javax.websocket-api-1.0.jarjavax.websocket-client-api-1.0.jar。 使用命令 gradle dependencies 我可以看到:

...
     +--- org.eclipse.jetty.websocket:javax-websocket-client-impl:9.4.31.v20200723
     |    +--- org.eclipse.jetty.websocket:websocket-client:9.4.31.v20200723 (*)
     |    \--- javax.websocket:javax.websocket-client-api:1.0
     +--- org.eclipse.jetty.websocket:websocket-server:9.4.31.v20200723 (*)
     \--- javax.websocket:javax.websocket-api:1.0

在我的 gradle.build 中,我只有:

dependencies {

    // Vaadin
    implementation enforcedPlatform('com.vaadin:vaadin-bom:18.0.6')
    implementation("com.vaadin:vaadin-core")
    implementation group: 'com.github.appreciated',name: 'vaadin-css-grid',version: '2.0.0'

    // Logging
    implementation group: 'org.apache.logging.log4j',name: 'log4j-core',version: '2.13.1'
    implementation group: 'org.apache.logging.log4j',name: 'log4j-api',name: 'log4j-slf4j-impl',version: '2.13.1'
    
    // Testing
    testImplementation group: 'junit',name: 'junit',version: '4.12'
    testImplementation group: 'org.skyscreamer',name: 'jsonassert',version: '1.5.0'

    // Jetty
    implementation group: 'org.eclipse.jetty',name: 'jetty-server',version: '9.4.31.v20200723'
    implementation group: 'org.eclipse.jetty',name: 'jetty-webapp',version: '9.4.31.v20200723'
    implementation group: 'org.eclipse.jetty.websocket',name: 'websocket-server',name: 'javax-websocket-server-impl',version: '9.4.31.v20200723'
}

所有这些日志真的很烦人(它们确实减慢了启动速度),我无法理解它们是否危险。

避免重复的正确方法是什么? 是否有一种技术可以指示 AnnotationParser 仅扫描某些依赖项? 我知道这个主题存在于不同的问题中,但我没有找到 gradle 的解决方案或通用的解决方案策略。

谢谢, 斯特凡诺

解决方法

在类路径的多个位置使用相同的类名是个坏主意。

这是 Java 上最常见的不稳定操作形式!

如果同一个类存在于类加载器中的多个位置,则 Java 中的类加载器无法保证加载顺序行为。

在一次运行中,您可能会意外地按照您想要的顺序加载类,并使其正常运行,然后在将来的某个日期您运行相同的程序并且加载顺序不同,现在您正在使用不同的类版本运行并且你有意想不到的行为。

解决此问题的唯一方法是清理您的类加载器并确保您只有 1 个您打算使用的类版本。

这就是 Jetty 告诉你的。

对于这个特定的 javax.websocket-apijavax.websocket-client-api,您希望在 gradle 级别排除 javax.websocket-client-api,因为所有 websocket 客户端类也都存在于 {{1 }}。

javax.websocket-api jar 仅适用于仅使用 javax.websocket-client-api 客户端而不使用 javax.websocket 服务器的项目。


遵循 joakim-erdfelt 的建议 我已经修改了我的 javax.websocket,这可以防止出现问题:

gradle.build

Gradle 文档在这里:Excluding transitive dependencies

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res