programing

@SpringBootApplication을 모두 사용하는 두 개의 SpringBoot 프로젝트

padding 2023. 7. 22. 09:31
반응형

@SpringBootApplication을 모두 사용하는 두 개의 SpringBoot 프로젝트

저는 데이터 프로젝트와 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 프로젝트를 적절하게 구성할 수 있습니까?

함께 사용할 Spring Boot Main 클래스를 지정해야 합니다.@SpringBootTest:

@SpringBootTest(classes = YourUiSpringBootApp.class)

동일한 패키지에 두 개의 SpringApplication 주석이 있으면 안 됩니다.

패키지 1.

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 {
}

패키지 2.

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 {

}

루트 패키지 및 시작 프로그램

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;
    }
}

이것은 끔찍한 생각입니다.제발 그러지마.두 개의 다른 프로젝트와 하나의 공통 프로젝트가 있는 것이 훨씬 좋습니다.

언급URL : https://stackoverflow.com/questions/41730099/two-spring-boot-projects-both-with-springbootapplication

반응형