使用@SpringBootApplication进行两次Spring Boot项目

时间:2017-01-18 21:51:07

标签: spring spring-boot

我有一个数据项目和UI项目。这两个项目都是Spring Boot应用程序。两个项目都具有相同的根包(com.myorg),其主类使用@SpringBootApplication注释。

数据项目的主要课程是:

package com.myorg;
@SpringBootApplication
public class DataApplication {

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

}

UI项目的主要课程是:

package com.myorg;
@SpringBootApplication
public class UiApplication {

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

}

UI项目通过以下Gradle依赖项依赖于数据项目:

dependencies {
    compile('com.myorg:data:1.0')
}

如果我运行UI应用程序,它运行没有问题。但是,如果我在UI应用程序中运行集成测试,如下所示:

package com.myorg
@RunWith(SpringRunner.class)
@SpringBootTest
public class UiIntTest {

    @Test
    public void contextLoads() {
    }

}

发生以下初始化错误:

java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes

在数据项目的主要课程中,如果我用

替换@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan({ "com.myorg" })

尝试运行集成测试时出现以下初始化错误:

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

例如,如果我尝试运行:

package com.myorg
@RunWith(SpringRunner.class)
@SpringBootTest
public class DataIntTest {

    @Test
    public void contextLoads() {
    }

}

如何正确配置数据和UI项目?

2 个答案:

答案 0 :(得分:21)

您需要指定与@SpringBootTest一起使用的Spring Boot Main类:

@SpringBootTest(classes = YourUiSpringBootApp.class)

答案 1 :(得分:1)

你不应该在同一个包中有两个SpringApplication注释。

第一包。

twoapps.one;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackageClasses = {One.class})
@EnableAutoConfiguration
public class One extends SpringApplication {
}

第二包。

twoapps.two;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackageClasses = {Two.class})
@EnableAutoConfiguration
public class Two extends SpringApplication {

}

Root package and launcher

package twoapps;

import org.springframework.boot.SpringApplication;
import twoapps.one.One;
import twoapps.two.Two;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Application {

    public static void main(String[] args) throws Exception {
        new Thread(() -> SpringApplication.run(One.class, args(args, "--spring.profiles.active=one"))).start();
        new Thread(() -> SpringApplication.run(Two.class, args(args, "--spring.profiles.active=two"))).start();
    }

    private static String[] args(String[] args, String s) {
        List<String> collect = Arrays.stream(args).collect(Collectors.toList());
        collect.add(s);
        String[] strings = collect.toArray(new String[]{});
        return strings;
    }
}

这是一个糟糕的主意。请不要这样做。有两个不同的项目和一个共同的项目要好得多。