开发者社区 问答 正文

我们能否仅在加载彼此后添加一个Maven依赖项?

我通过Maven依赖项导入jar,jar运行无限循环。我想在加载jar之前先完全解决一些其他依赖性。

我要加载

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

等到我收到日志

Exposing 2 endpoint(s) beneath base path '/actuator'
Tomcat started on port(s): 1339 (http) with context path ''

然后加载我的jar依赖项。

发生的事情是,它开始加载依赖项,然后陷入了jar的无限循环中,并没有完成。

谢谢

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 10:26:24 463 分享 版权
1 条回答
写回答
取消 提交回答
  • jar不会运行无限循环,jar是工件内部的一堆二进制源(可能还有一些资源,例如json,属性文件,xml等)。

    因此,maven作为构建工具的工作是准备工件。一旦构建了工件,专家就完成了,您将无法再影响/更改事物。

    现在,由于您有一个像spring这样的运行时框架-它可以在以下条件下在jar中运行一些bean:

    • 以惰性方式加载Bean(仅当首先调用Bean的方法时)
    • 异步运行bean的方法(通过使用@Async注释)
    • 仅在指定了某些概要文件(或其他条件,如属性)时才加载bean。 所有这些都是在spring的帮助下在运行时自定义应用程序行为的方法,但是再次,从技术上讲,maven与此处无关。

    所以为了

    避免罐子内部无限循环

    您可以找出哪个bean导致了无限循环(同样,它通常不是“ jar”,而是某些特定的bean)

    使用@Async批注或定义自己的线程池,然后运行在其中导致循环的Bean的方法(这@Async是一种更有弹性的方法)

    无论如何,如果您是通过Spring加载bean的,它都有一个线程来填充应用程序上下文(即加载所有bean并使用依赖项注入机制)。因此,如果此线程因某个bean在初始化期间导致无限循环而被卡住(构造函数或后构造方法),则整个应用程序将被卡住。

    回答来源:Stack Overflow

    2020-03-27 10:27:10
    赞同 展开评论