Spring Boot 프로젝트 계승 의존 으로 인 한 컴 파일 실패 문 제 를 기록 합 니 다.

문제 의 배경, 회사 의 Spring Boot 를 사용 하 는 Mutil 프로젝트 는 Spring Boot 공식 문서 에 따라 Parent 계승 spring-boot-starter-parent POM 을 설정 할 때 정상적으로 컴 파일 하여 실행 할 수 있 지만, 정식 출시 시 상속 회사 의 통 일 된 플러그 인 집합 Parent POM 으로 전환 해 야 합 니 다.(여기 서 잠시 common - plugin 이 라 고 부 릅 니 다. 이 플러그 인 은 지속 적 인 통합 컴 파일 자동화 플러그 인 을 편리 하 게 실행 하기 위해 서 입 니 다. 예 를 들 어 maven-deploy-plugin, maven-docker-plugin 등 플러그 인 을 실행 한 후에 문제 가 발생 했 습 니 다. 컴 파일 이 통과 되 지 않 고 유사 한 힌트 는 종 류 를 찾 을 수 없 으 며 기호의 오류 메 시 지 를 찾 을 수 없습니다.
Spring Boot 홈 페이지 문서 에 따 르 면 프로젝트 는 계승 spring-boot-starter-parent 을 부모 POM 으로 설정 해 야 한 다 는 것 을 잘 알 고 있 습 니 다.
<parent>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-parentartifactId>
    <version>2.0.2.RELEASEversion>
parent>

.....

<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
        <scope>testscope>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
dependencies>

이와 같은 설정 은 이때 컴 파일 mvn clean package 을 실행 하 는 데 문제 가 없습니다. 그러나 현재 의 상황 은 우리 의 프로젝트 가 자신의 Parent POM common-plugin 을 계승 해 야 합 니 다. 이때 컴 파일 을 실행 하 는 방식 은 통 하지 않 습 니 다. 하나의 POM 파일 에서 하나의 Parent 만 계승 할 수 있 기 때 문 입 니 다. 물론 우 리 는 spring-boot-starter-parent 을설정 common-plugin 에 의존 하면 됩 니 다! 우선 이런 방식 은 문제 가 없 지만 고려 common-plugin공용 POM 사용자 정의 플러그 인 집합 으로 설정 후 회사 의 모든 프로젝트 그룹 에 의 해 계승 되 어 사 용 됩 니 다. 또한 각종 jar 버 전 의존 문제 가 발생 하 는 지 는 말 할 것 도 없 이 Spring 과 관련 된 jar 버 전 의존 문 제 는 처리 하기 어렵 습 니 다. 이 를 고려 하면 비용 이 너무 높 고 위험 이 큽 니 다. 그러면 어떻게 해 야 합 니까? 사실 Spring Boot 홈 페이지 문서 에서 드 립 니 다.해결 방안 이 나 왔 습 니 다. 프로젝트 부모 POM 설정 은 다음 과 같 습 니 다.
<dependencyManagement>
    <dependencies>
        <dependency>
            
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-dependenciesartifactId>
            <version>2.0.2.RELEASEversion>
            <type>pomtype>
            <scope>importscope>
        dependency>
    dependencies>
dependencyManagement>

위의 설정 역시 Parent POM 을 계승 하 는 방식 과 같은 역할 을 하 며, 다 중 Parent 가 지원 하지 않 는 문 제 를 해결 할 수 있 습 니 다. 한 가지 더 말씀 드 리 고 싶 은 것 은 Muti 프로젝트 의 각 하위 모듈 에 의존 을 다시 설정 하지 않 아 도 됩 니 다 spring-boot-dependencies. 부모 프로젝트 의 POM 만 계승 하면 됩 니 다.. 하위 모듈 에 이 의존 도 를 다음 과 같이 추가 하면 컴 파일 이 잘못 되 었 습 니 다.
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-dependenciesartifactId>
dependency>

따라서 하위 모듈 은 이 의존 도 를 다시 추가 할 필요 가 없습니다. 또한 부모 프로젝트 가 spring-boot-dependencies 의존 도 를 계승 한 후 하위 모듈 이 부모 프로젝트 POM 을 계승 하면 하위 모듈 이 관련 의존 도 를 사용 할 때 version 버 전 을 지정 할 필요 가 없습니다. 예 를 들 어 하위 모듈 설정 은 다음 과 같 습 니 다.
<dependencies>
    ......
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
dependencies>

의존 version 을 지정 할 필요 가 없습니다. 이것 은 spring-boot-dependencies POM 에서 해당 하 는 버 전 을 정 의 했 기 때 문 입 니 다. Maven 창고 pom 파일 에서 의존 하 는 버 전 정 의 를 다음 과 같이 볼 수 있 습 니 다.
<dependencies>
    ......
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
        <version>2.0.2.RELEASEversion>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
        <version>2.0.2.RELEASEversion>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
        <version>2.0.2.RELEASEversion>
    dependency>
dependencies>

자, 여기 서 Parent POM 의존 으로 인 한 컴 파일 실패 문 제 를 기본적으로 해결 할 수 있 습 니 다. 그러나 일이 끝나 지 않 았 습 니 다. 위 설정 을 수정 한 후에 도 하위 항목 의 한 파일 에 다시 컴 파일 하면 클래스 를 찾 을 수 없고 기 호 를 찾 을 수 없습니다. 오류 정 보 는 다음 과 같 습 니 다.
.....
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project bop-service-crm: Compilation failure: Compilation failure:
[ERROR] /Users/wanyang3/git/mutiproject/sub_project_service/src/main/java/com/test/service/modul/impl/ModuleServiceImpl.java:[21,47]      
[ERROR]   :     RestController
[ERROR]   :     org.springframework.web.bind.annotation
[ERROR] /Users/wanyang3/git/mutiproject/sub_project_service/src/main/java/com/test/service/modul/impl/ModuleServiceImpl.java:[47,2]      
[ERROR]   :   RestController
......

What? IDE 에서 볼 수 있 는 이것 org.springframework.web.bind.annotation.RestController 은 있 습 니 다. 부모 POM 에서 Parent POM common-plugin 코드 의존 을 주석 해 보 세 요. 컴 파일 을 실행 하면 통 과 될 수 있 는 지, 문 제 를 설명 할 수 있 는 지 common-plugin 에서 나 왔 는 지 알 수 있 습 니 다.
자세히 살 펴 보면 org.springframework.web.bind.annotation.RestController 이 종 류 는 spring - web 가방 에 속 하 는 것 으로 나 타 났 다. 그리고 이 두 개의 Parent POM 에서 spring 과 관련 된 버 전 을 조회 한 결과 놀 라 운 발견 은 모두 각자 의 spring 버 전 을 정의 했다. common-plugin 에 서 는 3.0.6.RELEASE 이 정의 되 었 고 spring-boot-dependencies Parent POM 에 서 는 4.3.14.RELEASE 이 정의 되 었 다.후자 만 사용 할 때 컴 파일 은 통과 할 수 있 습 니 다. 전자 만 사용 할 때 컴 파일 이 통과 되 지 않 습 니 다. 다음은 Spring 버 전 4.3.14.RELEASE 을 통일 하여 컴 파일 이 통 과 될 수 있 는 지 확인 하 겠 습 니 다.
저 희 는 덮어 쓰기 common-plugin 의 spring. version 방식 으로 버 전 통일 을 완성 합 니 다. 먼저 위 에 설명 한 코드 를 놓 은 다음 프로젝트 부모 POM 에 spring. version 속성 을 설정 합 니 다.
<parent>
    <artifactId>common-pluginartifactId>
    <groupId>com.plugin.commongroupId>
    <version>1.1.0version>
parent>
......    
<properties>
    ......
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <java.version>1.8java.version>
    <spring.version>4.3.14.RELEASEspring.version>
properties>

이렇게 하면 프로젝트 를 4.3.14. RELEASE 버 전 으로 지정 할 수 있 습 니 다! 컴 파일 을 다시 실행 하 니 컴 파일 이 통과 되 었 습 니 다!! 버 전이 충돌 에 의존 하 는 문제 인 것 같 습 니 다!
참고 자료
  • Spring Boot Docs
  • Maven Repo spring-boot-dependencies.pom
  • 좋은 웹페이지 즐겨찾기