如何解决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.jar
和 javax.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-api
和 javax.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 举报,一经查实,本站将立刻删除。