签名的Jar文件中的Spring Component Scan(@Autowire)很慢

时间:2017-11-03 12:08:33

标签: java spring performance jar signed

多年前我们遇到了独立java应用程序中Spring组件扫描速度慢的问题所以我在stackoverflow中问过: Slow spring component scan 。多年以后我再次​​偶然发现了这个问题,我想我发现它为什么很慢:这是因为jar文件是签名的。 目前我们的应用程序中有大约170个jar文件。我们自己和第三方。我们签下所有人。 通常我们使用webstart,组件扫描的性能也可以。 只需执行" java -cp mainclass"就可以通过庞大的类路径启动我们的应用程序compoennt扫描需要几分钟。 如果我只是从所有jar文件中删除MANIFEST.MF文件(只包含签名信息),再次运行应用程序,速度就像webstart一样快。 所以签名检查似乎需要花费很多时间。 我尝试在Java控制台中停用签名扫描。没有效果。仍然很慢。是否有java运行时参数?

2 个答案:

答案 0 :(得分:0)

我目前遇到了与签名的超级jar相同的问题。它可能与自动连接有关,但与上下文组件扫描有关,以防您在XML配置中使用它。我发现了一个旧的Spring核心ticket提到了这一点。该票据已关闭解决方案:赢得

我已经删除了组件扫描并将其替换为XML bean,它似乎正在运行。我仍然遇到使用内省(org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean)在运行时生成的CXF Web服务的问题。每项服务需要大约2分钟才能创建。但至少取得了一些进展。

还有一些值得注意的事情:Java 9上的Java Web Start应用程序运行速度很慢,尽管它的速度非常快,只有1.8

答案 1 :(得分:0)

解决方案是使用spring-context-indexer创建候选组件索引。将spring-context-indexer添加为Gradle中的compileOnly依赖项,或在您的IDE中将其注册为注释处理器。

请参见documentation

这将在jar的META-INF目录中创建一个名为spring.components的文件。 Spring将自动使用此组件列表,而不是扫描整个jar的每个类。