【问题标题】:Spring Component Scan (@Autowire) in signed Jar Files is slow签名 Jar 文件中的 Spring Component Scan (@Autowire) 很慢
【发布时间】:2018-04-16 03:59:53
【问题描述】:

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

【问题讨论】:

  • 为了完整性:Java 的哪个版本和供应商? (例如:Oracle 运行时、OpenJDK 构建,...)
  • 这是标准。 Oracle JDK 8u141 和我尝试过其他的(总是标准的。Oracle)。一直都是一样的效果

标签: java spring performance jar signed


【解决方案1】:

我目前在使用已签名的 uber-jar 时遇到了同样的问题。它可能与自动装配无关,但与上下文组件扫描有关,以防您也在 XML 配置中使用它。我发现一个旧的 Spring 核心 ticket 提到了这一点。工单已通过 Resolution: Won't Fix 关闭...

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

还有一点值得注意:在 Java 9 上使用 Java Web Start 时应用程序很慢,尽管使用 1.8 时速度非常快

【讨论】:

    【解决方案2】:

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

    请参阅documentation

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2020-11-20
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多