programing

스프링 부트 스타터 의존성이 메이븐의 과도 의존성 메커니즘의 명시된 의도와 다르게 사용되도록 설계된 이유는 무엇입니까?

cafebook 2023. 10. 25. 23:44
반응형

스프링 부트 스타터 의존성이 메이븐의 과도 의존성 메커니즘의 명시된 의도와 다르게 사용되도록 설계된 이유는 무엇입니까?

메이븐 종속성 문서에 따르면 모든 컴파일 종속성은 컴파일 시에 일시적으로 사용되는 것이 아니라 명시적으로 나열되는 것이 목적입니다.

대신 [transient complete dependency](과도적 컴파일 종속성)이 런타임 범위가 되어야 모든 컴파일 종속성이 명시적으로 나열되어야 합니다. 그러나 의존하는 라이브러리가 다른 라이브러리에서 클래스를 확장하여 컴파일 시간에 사용할 수 있도록 하는 경우가 있습니다.이러한 이유로 컴파일 시간 종속성은 과도한 경우에도 컴파일 범위로 유지됩니다.

스프링부트는 "스타터" 의존성이라는 개념을 가지고 있습니다.Spring Boot 자체 문서(Spring Boot 자체 예 및 다른 곳에서 본 많은 사용 예)를 보면, 이러한 문서들은 런타임과 컴파일 시 모두에 사용될 수많은 다른 의존성을 일시적으로 도입하기 위한 것임이 분명합니다.Spring Boot의 설명서에 따라:

시작 프로그램은 응용 프로그램에 포함할 수 있는 편리한 종속성 설명자 집합입니다.샘플 코드를 탐색하고 의존성 설명자를 복사하지 않고도 필요한 모든 Spring 및 관련 기술을 원스톱으로 이용할 수 있습니다.예를 들어 데이터베이스 액세스를 위해 Spring 및 JPA 사용을 시작하려면 프로젝트에 spring-boot-starter-data-jpa 종속성을 포함시키기만 하면 됩니다.

시작 프로그램에는 프로젝트를 신속하게 실행하고 일관되고 지원되는 일련의 관리되는 과도적 의존성이 포함되어 있습니다.

이 메커니즘을 사용하여 컴파일 범위 종속성을 일시적으로 가져오는 것은 메이븐이 공식적으로 사용하고자 하는 의도와 상충되는 것으로 보입니다.이것을 매우 명확하게 하는 한 가지는 메이븐 스타터 의존성을 직접 사용할 때 경고를 표시하는 메이븐 의존성: Analyze plugin 목표입니다.예를 들어, 실행 중mvn dependency:analyzeSpring Boot 자체의 "Getting Starting" 예제에서는 다음과 같은 출력을 생성합니다.

[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-web:jar:4.3.6.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-test:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework:spring-test:jar:4.3.6.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile
[WARNING]    org.hamcrest:hamcrest-library:jar:1.3:test
[WARNING]    org.springframework:spring-context:jar:4.3.6.RELEASE:compile
[WARNING]    junit:junit:jar:4.12:test
[WARNING]    org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile
[WARNING]    org.springframework:spring-beans:jar:4.3.6.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING]    org.springframework.boot:spring-boot-starter-web:jar:1.5.1.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:1.5.1.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-starter-actuator:jar:1.5.1.RELEASE:compile

Spring Boot 스타터 패턴이 왜 기본 빌드 시스템의 명시된 의도와 직접적으로 반대되는 방식으로 설계되었는지 의문입니다.주제에 대한 게시된 토론이나 설명이 있습니까?

이 문제는 스프링 부트 프로젝트에서 spring-boot#8341로 문제가 제기되었습니다.몇몇 Spring Boot 개발자들은 이 문제에 대해 이것이 실제로 메이븐 의존성 메커니즘의 오용이 아니라는 의견을 표명하기 위해 이 문제에 대응했습니다.

코멘트:

스프링 부트 스타터 패턴이 기본 빌드 시스템의 의도와 직접적으로 반대되는 방식으로 설계된 이유는 무엇입니까?

IMO, 메이븐의 문서에서 한 문장을 너무 많이 읽으셨습니다.경고를 받기 위해서는 선택을 해야 한다는 말인 것 같습니다.

이 오용이 "괜찮다"고 느낀 이유가 있습니까?

오용은 다소 주관적입니다.저는 선발이 오용이라고 생각하지 않습니다.그렇다면 모든 컴파일 종속성을 명시적으로 선언할 수 있습니다.

단순한 메이븐 구성 하나로 기존 버전에 의존성 세트를 편리하게 제공하는 이 기능을 보다 효과적으로 구현할 수 있는 "올바른" 방법이 있습니까?

저는 그렇게 생각하지 않습니다. 이것은 과도적 컴파일 종속성이 컴파일 범위에 남아 있고 기본적으로 경고가 생성되지 않는 매우 좋은 이유 중 하나일 수 있습니다.

코멘트:

당신은 이것을 너무 많이 읽고 있고 당신의 관점은 실행가능성이 부족합니다 IMO.의존성:분석 목표는 컴파일 클래스 경로에 실제로 필요한 것만 포함되어 있음을 사용자에게 감지할 수 있는 방법을 제공하기 위한 수단이었습니다.문서의 이 문장은 컴파일 범위가 왜 자동적인지를 설명하기 위한 것일 뿐입니다.

[...]

돌이켜보면, Spring Boot을 사용하지 않는 수많은 프로젝트가 자체 컴파일 종속성을 모두 나열하지 않기 때문에 Spring Boot 질문이 아닌 Maven 질문을 받고 있는 것입니다.

이 피드백을 기반으로 Maven Dependency Plugin이 이러한 과도적 종속성 사용에 대해 경고하지 않도록 티켓 MDEP-557이 생성되었습니다.

따라서 Spring Boot 팀은 이 문제에 대한 답을 얻기 위해 이것이 과도적 의존성을 적절하게 사용하는 것이며, 이것이 Maven의 의도에 반하지 않는다고 생각합니다.

주의 시 종속성 플러그인이 실패하도록 구성한 것 같습니다.제 생각에는 의존성 플러그인이 명시적으로 과도 의존성을 선언하지 않았다면 경고를 내뱉는 것 같습니다.

변경 시도<failOnWarning>true</failOnWarning>로.<failOnWarning>false</failOnWarning>

언급URL : https://stackoverflow.com/questions/27994153/why-were-spring-boot-starter-dependencies-designed-to-be-used-contrary-to-the-st

반응형