2017-03-18 10 views
0

2 개의 모듈 'appA'와 'appB'를 참조하는 집계 자 POM이 있습니다. 'appB'는 종속성으로 'appA'에 의존합니다. 'appB'는 'spring-boot-starter-parent'를 부모 POM으로 사용합니다. 'appA'에는 com.multipom 패키지에 정의 된 bean ('hwBean')이 있습니다. config "독립 모듈의 spring-boot-starter-parent는 종속 모듈에서 bean을 볼 수 없도록합니다.

'appB'응용 프로그램이 실행될 때 'appA'가 'spring-boot-starter-parent'를 부모 POM으로 사용하지 않는 경우에만 'hwBean'이 표시됩니다. 'appA'가 부모 POM으로 'spring-boot-startter-parent'를 사용하면 'appA'에 정의 된 'hwBean'bean을 'appB'에서 사용할 수 없습니다. 이것은 스프링 부트 버그입니까? APPA 모듈

---- ------ com.multipom.App_A.java

package com.multipom; 

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

---- com.multipom.config.ApplicationConfig AppB 모듈

된 .java
package com.multipom.config; 
@Configuration 
public class ApplicationConfig { 
    @Bean 
    public String hwBean() { 
     return "Hello World"; 
    } 
} 

com.multipom.App_B.java ---- ------

package com.multipom; 

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

루트/

의 pom.xml
<groupId>com.splitpom</groupId> 
<artifactId>root</artifactId> 
<version>1.0.0</version> 
<packaging>pom</packaging> 
<modules> 
    <module>./appA</module> 
    <module>./appB</module> 
</modules> 

appB/POM .xml

<groupId>com.multipom</groupId> 
<artifactId>appB</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>appB</name> 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.2.RELEASE</version> 
    <relativePath/> <!-- lookup parent from repository --> 
</parent> 

<dependencies> 
    <dependency> 
    <groupId>com.multipom</groupId> 
    <artifactId>appA</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
</dependencies> 
백45경1천5백15조5백36억9천1백36만3천2백10

APPA/pom.xml 파일 (케이스 1)

<groupId>com.multipom</groupId> 
<artifactId>appA</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>appA</name> 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.2.RELEASE</version> 
    <relativePath/> <!-- lookup parent from repository --> 
</parent> 

APPA/pom.xml 파일 (케이스 2)

<groupId>com.multipom</groupId> 
<artifactId>appA</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 

<name>appA</name> 
<parent> 
    <groupId>com.splitpom</groupId> 
    <artifactId>root</artifactId> 
    <version>1.0.0</version> 
</parent> 

$ java -jar appA-0.0.1-SNAPSHOT.jar 

2017-03-18 11:23:23.340 TRACE 26149 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appA/target/appA-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/config/ApplicationConfig.class] 
2017-03-18 11:23:23.415 DEBUG 26149 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: URL [jar:file:/multipom/appA/target/appA-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/config/ApplicationConfig.class] 
2017-03-18 11:23:23.416 TRACE 26149 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appA/target/appA-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_A.class] 
2017-03-18 11:23:23.430 TRACE 26149 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: URL [jar:file:/multipom/appA/target/appA-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_A.class] 
2017-03-18 11:23:24.084 DEBUG 26149 --- [   main] a.ConfigurationClassBeanDefinitionReader : Registering bean definition for @Bean method com.multipom.config.ApplicationConfig.hwBean() 

CASE 1 : 부모와의 POM에 'APPA'사용 '스프링 부팅 스타터 부모'('appB은'APPA '

$ java -jar appB-0.0.1-SNAPSHOT.jar 

2017-03-18 11:24:31.461 TRACE 26203 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_B.class] 
2017-03-18 11:24:31.546 TRACE 26203 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_B.class] 

에서'hwBean '를 찾을 수없는 것으로 여기에 통지 사례 2 : 'appA'가 부모 POM으로 'spring-boot-startter-parent'를 사용하지 않는 경우 ('appB'가 'appA'에서 'hwBean'을 찾습니다.

$ java -jar appB-0.0.1-SNAPSHOT.jar 
2017-03-18 12:03:28.261 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_B.class] 
2017-03-18 12:03:28.316 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_B.class] 
2017-03-18 12:03:28.316 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/App_A.class] 
2017-03-18 12:03:28.324 DEBUG 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/App_A.class] 
2017-03-18 12:03:28.325 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/config/ApplicationConfig.class] 
2017-03-18 12:03:28.330 DEBUG 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/config/ApplicationConfig.class] 
2017-03-18 12:03:28.348 DEBUG 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 
2017-03-18 12:03:28.373 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_B.class] 
2017-03-18 12:03:28.384 DEBUG 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/multipom/App_B.class] 
2017-03-18 12:03:28.385 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/App_A.class] 
2017-03-18 12:03:28.388 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Ignored because not matching any filter: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/App_A.class] 
2017-03-18 12:03:28.389 TRACE 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Scanning URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/config/ApplicationConfig.class] 
2017-03-18 12:03:28.390 DEBUG 27097 --- [   main] o.s.c.a.ClassPathBeanDefinitionScanner : Identified candidate component class: URL [jar:file:/multipom/appB/target/appB-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/appA-0.0.1-SNAPSHOT.jar!/com/multipom/config/ApplicationConfig.class] 
2017-03-18 12:03:29.123 DEBUG 27097 --- [   main] a.ConfigurationClassBeanDefinitionReader : Registering bean definition for @Bean method com.multipom.config.ApplicationConfig.hwBean() 

답변

1

문제는 spring-boot-maven-plugin이 종속성 병을 패키지하는 방식입니다.기본 설정에서이 플러그인은 모든 클래스를/BOOT-INF/classes/.... 아래에 놓는 특별한 실행 가능한 jar 형식으로 jar를 패키징합니다. jar 파일이 다른 모듈의 종속물로 사용되면 원하지 않습니다. 그. 대신 항아리가 평평한 항아리 여야하므로 포함 된 모든 콩을 종속 앱이 검색 할 수 있습니다. 해결 방법은 spring-boot-maven-plugin 섹션 (appA/pom.xml)에 다음을 추가하는 것입니다.

<executions> 
      <execution> 
       <goals> 
        <goal>repackage</goal> 
       </goals> 
       <configuration> 
        <classifier>exec</classifier> 
       </configuration> 
      </execution> 
     </executions>