【问题标题】:Spring: Run multiple "SpringApplication.Run()" in application main methodSpring:在应用程序主方法中运行多个“SpringApplication.Run()”
【发布时间】:2014-08-22 08:32:45
【问题描述】:

嘿,我是 spring 新手,我试图在我的 Applications.java 的 main 中运行多个运行方法。

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        SpringApplication.run(ScheduledTasks.class);
    }
}

当我尝试运行它时,我得到了一个异常。

有没有办法在 main 中调用这两个 run 方法?

-堆栈跟踪

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:135)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:683)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:944)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:933)
    at testWebApp.Application.main(Application.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)

【问题讨论】:

  • 为什么需要第二次调用run方法?你不能只在应用程序中使用@Autowire@Import ScheduledTasks 吗?

标签: java spring main spring-boot


【解决方案1】:

我认为您尝试使用两种配置运行一个 spring 应用程序。

执行此操作的正常方法是使用@Import 注释。

@ComponentScan
@EnableAutoConfiguration
@Import(ScheduledTasks.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@见Spring Reference Chapter 4.12.5 Composing Java-based configurations Using the @Import annotation

【讨论】:

    【解决方案2】:

    run 方法支持对象数组。此代码有效

    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.SpringApplication;
    import org.springframework.context.annotation.ComponentScan;
    
    @ComponentScan
    @EnableAutoConfiguration
    public class Application {
    
        public static void main(String[] args) {
            Object[] sources = {Application.class, ScheduledTasks.class};
            SpringApplication.run(sources, args);
        }
    }
    

    【讨论】:

      【解决方案3】:

      没有看到代码是不可能的,但我猜你正在尝试使用相同的端口启动 2 个 web 应用程序。您可以更改其中一个的端口,或者使其成为非 web 应用程序。我建议使用SpringApplicationBuilder 来设置这些东西。

      【讨论】:

        猜你喜欢
        • 2014-08-07
        • 1970-01-01
        • 2015-12-30
        • 2023-03-16
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 2019-05-31
        相关资源
        最近更新 更多