Gradle Jetty AnnotationParser从多个位置扫描警告

Gradle Jetty AnnotationParser从多个位置扫描警告,gradle,websocket,jetty,vaadin,Gradle,Websocket,Jetty,Vaadin,我有一个用Gradle构建的项目,它实际上是一个Vaadin项目,有一个servlet,我在其中使用Jetty。 在启动时(即gradle run),我收到了来自AnnotationParser的许多不同的关于类复制的警告消息。我只复制一个,因为日志非常详细: [INFO ] 11:22:50.375 org.eclipse.jetty.server.Server.doStart() - jetty-9.4.31.v20200723; built: 2020-07-23T17:57:36.812

我有一个用Gradle构建的项目,它实际上是一个Vaadin项目,有一个servlet,我在其中使用Jetty。 在启动时(即gradle run),我收到了来自
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中
我只有:

依赖项{
//瓦丁
实施强制平台('com.vaadin:vaadin bom:18.0.6')
实现(“com.vaadin:vaadin核心”)
实现组:“com.github.emperated”,名称:“vaadin css网格”,版本:“2.0.0”
//伐木
实现组:“org.apache.logging.log4j”,名称:“log4j核心”,版本:“2.13.1”
实现组:“org.apache.logging.log4j”,名称:“log4japi”,版本:“2.13.1”
实现组:“org.apache.logging.log4j”,名称:“log4j-slf4j-impl”,版本:“2.13.1”
//测试
测试实现组:“junit”,名称:“junit”,版本:“4.12”
测试实施组:'org.skyshrayer',名称:'jsonassert',版本:'1.5.0'
//码头
实现组:“org.eclipse.jetty”,名称:“jetty服务器”,版本:“9.4.31.v20200723”
实现组:“org.eclipse.jetty”,名称:“jetty webapp”,版本:“9.4.31.v20200723”
实现组:“org.eclipse.jetty.websocket”,名称:“websocket服务器”,版本:“9.4.31.v20200723”
实现组:“org.eclipse.jetty.websocket”,名称:“javaxwebsocketserverimpl”,版本:“9.4.31.v20200723”
}
所有这些日志都很烦人(它们会大大降低启动速度),我不知道它们是否危险

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

谢谢,
Stefano

在类路径的多个位置具有相同的类名是个坏主意

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

如果类加载器中的多个位置存在同一个类,那么Java中的类加载器不能保证加载顺序行为

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

解决这个问题的唯一方法是清理类加载器,并确保您只有一个要使用的类版本

这就是Jetty告诉你的

对于这个特定的类,
javax.websocket api
javax.websocket客户端api
,您希望在渐变级别排除
javax.websocket客户端api
,因为所有的websocket客户端类也存在于
javax.websocket api

javax.websocket客户机api
jar仅适用于只使用
javax.websocket
客户机,而不使用
javax.websocket
服务器的项目


按照joakim erdfelt的建议 我已修改了我的
gradle.build
,这可以防止出现问题:

    implementation ('org.eclipse.jetty.websocket:javax-websocket-server-impl:9.4.31.v20200723')  {
        exclude module: 'javax.websocket-client-api' 
    }

Gradle文档在这里:

感谢您的回复,您能告诉我如何排除Gradle的某些依赖性吗?