Gradle 에서 io.spring.dependency-management 를 도입하면 Dependency Tree 가 바뀌어 버렸지만 원래 그쪽이 맞았던 이야기.
TL;DR
io.spring.dependency-management
를 넣었을 때의 거동이 옳다. io.spring.dependency-management
를 넣으면, 자신이 DependencyManagement 를 사용할 뿐만 아니라, 종속성의 도중에 DependencyManagement 가 있을 경우에 Gradle 가 그것을 올바르게 취급한다. 발생한 일
io.spring.dependency-management 없음
compileClasspath - Compile classpath for source set 'main'.
\--- org.glassfish.jersey.core:jersey-common:2.13
+--- javax.ws.rs:javax.ws.rs-api:2.0.1
+--- javax.annotation:javax.annotation-api:1.2
+--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.13
+--- org.glassfish.hk2:hk2-api:2.3.0-b10
| +--- javax.inject:javax.inject:1
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| | \--- javax.inject:javax.inject:1
| \--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
+--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
+--- org.glassfish.hk2:hk2-locator:2.3.0-b10
| +--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
| +--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
| +--- org.glassfish.hk2:hk2-api:2.3.0-b10 (*)
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10 (*)
| \--- org.javassist:javassist:3.18.1-GA
\--- org.glassfish.hk2:osgi-resource-locator:1.0.1
io.spring.dependency-management 예
compileClasspath - Compile classpath for source set 'main'.
\--- org.glassfish.jersey.core:jersey-common:2.13
+--- javax.ws.rs:javax.ws.rs-api:2.0.1
+--- javax.annotation:javax.annotation-api:1.2
+--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.13
+--- org.glassfish.hk2:hk2-api:2.3.0-b10
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| \--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
+--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
+--- org.glassfish.hk2:hk2-locator:2.3.0-b10
| +--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
| +--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
| +--- org.glassfish.hk2:hk2-api:2.3.0-b10 (*)
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| \--- org.javassist:javassist:3.18.1-GA
\--- org.glassfish.hk2:osgi-resource-locator:1.0.1
diff -U 5 plugin_without/dependencies.txt plugin_with/dependencies.txt
compileOnly - Compile only dependencies for source set 'main'.
No dependencies
@@ -41,20 +39,18 @@
\--- org.glassfish.jersey.core:jersey-common:2.13
+--- javax.ws.rs:javax.ws.rs-api:2.0.1
+--- javax.annotation:javax.annotation-api:1.2
+--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.13
+--- org.glassfish.hk2:hk2-api:2.3.0-b10
- | +--- javax.inject:javax.inject:1
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
- | | \--- javax.inject:javax.inject:1
| \--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
+--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
+--- org.glassfish.hk2:hk2-locator:2.3.0-b10
| +--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
| +--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
| +--- org.glassfish.hk2:hk2-api:2.3.0-b10 (*)
- | +--- org.glassfish.hk2:hk2-utils:2.3.0-b10 (*)
+ | +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| \--- org.javassist:javassist:3.18.1-GA
\--- org.glassfish.hk2:osgi-resource-locator:1.0.1
하아, 어째서,,, 닌자난데. . .
Debug
오른쪽 클릭에서 Debug 수 있다고 들었는데. . .
뭔가 잘 안돼
다시 보면
의존성에도 신경 쓰이는 곳이 없다는 것은 아닙니다.
org.glassfish.hk2:hk2-api:2.3.0-b10
-> 베타?
글쎄요.
pom.xml of org.glassfish.hk2:hk2-api:2.3.0-b10
compileClasspath - Compile classpath for source set 'main'.
\--- org.glassfish.jersey.core:jersey-common:2.13
+--- javax.ws.rs:javax.ws.rs-api:2.0.1
+--- javax.annotation:javax.annotation-api:1.2
+--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.13
+--- org.glassfish.hk2:hk2-api:2.3.0-b10
| +--- javax.inject:javax.inject:1
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| | \--- javax.inject:javax.inject:1
| \--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
+--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
+--- org.glassfish.hk2:hk2-locator:2.3.0-b10
| +--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
| +--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
| +--- org.glassfish.hk2:hk2-api:2.3.0-b10 (*)
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10 (*)
| \--- org.javassist:javassist:3.18.1-GA
\--- org.glassfish.hk2:osgi-resource-locator:1.0.1
compileClasspath - Compile classpath for source set 'main'.
\--- org.glassfish.jersey.core:jersey-common:2.13
+--- javax.ws.rs:javax.ws.rs-api:2.0.1
+--- javax.annotation:javax.annotation-api:1.2
+--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.13
+--- org.glassfish.hk2:hk2-api:2.3.0-b10
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| \--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
+--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
+--- org.glassfish.hk2:hk2-locator:2.3.0-b10
| +--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
| +--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
| +--- org.glassfish.hk2:hk2-api:2.3.0-b10 (*)
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| \--- org.javassist:javassist:3.18.1-GA
\--- org.glassfish.hk2:osgi-resource-locator:1.0.1
compileOnly - Compile only dependencies for source set 'main'.
No dependencies
@@ -41,20 +39,18 @@
\--- org.glassfish.jersey.core:jersey-common:2.13
+--- javax.ws.rs:javax.ws.rs-api:2.0.1
+--- javax.annotation:javax.annotation-api:1.2
+--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.13
+--- org.glassfish.hk2:hk2-api:2.3.0-b10
- | +--- javax.inject:javax.inject:1
| +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
- | | \--- javax.inject:javax.inject:1
| \--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
+--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
+--- org.glassfish.hk2:hk2-locator:2.3.0-b10
| +--- org.glassfish.hk2.external:javax.inject:2.3.0-b10
| +--- org.glassfish.hk2.external:aopalliance-repackaged:2.3.0-b10
| +--- org.glassfish.hk2:hk2-api:2.3.0-b10 (*)
- | +--- org.glassfish.hk2:hk2-utils:2.3.0-b10 (*)
+ | +--- org.glassfish.hk2:hk2-utils:2.3.0-b10
| \--- org.javassist:javassist:3.18.1-GA
\--- org.glassfish.hk2:osgi-resource-locator:1.0.1
오른쪽 클릭에서 Debug 수 있다고 들었는데. . .
뭔가 잘 안돼
다시 보면
의존성에도 신경 쓰이는 곳이 없다는 것은 아닙니다.
org.glassfish.hk2:hk2-api:2.3.0-b10
-> 베타?
글쎄요.
pom.xml of org.glassfish.hk2:hk2-api:2.3.0-b10
//repo1.maven.org/maven2/org/glassfish/hk2/hk2-api/2.3.0-b10/hk2-api-2.3.0-b10.pom
<dependencies>
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>osgi-resource-locator</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2-utils</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.hk2.external</groupId>
<artifactId>aopalliance-repackaged</artifactId>
</dependency>
</dependencies>
보통 의존하고 있다고 써 있지만. . . Exclude도 없고.
--debug 실행해보기
% ./gradlew dependencies --debug
11:34:46.517 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder] javax.inject:javax.inject is excluded from org.glassfish.hk2:hk2-api:2.3.0-b10(compile) by {"exclude module id" : "javax.inject:javax.inject"}.
확실히 의도대로 exclude 하고 있는 것 같다.
gradle/DependencyGraphBuilder.java at v5.6.3 · gradle/gradle 그렇지만 이 파일에 is excluded
의 문자가 없기 때문에 손 막히는 느낌. . .
여기? gradle/NodeState.java at v5.6.3 · gradle/gradle
싫기 때문에 LOGGER를 필기하는 것은 안 된다고. . . gradle/NodeState.java at v5.6.3 · gradle/gradle
Debug 시도
잘 소스가 없으므로 다음 두 가지는 로컬 빌드되었습니다.
% ./gradlew dependencies --debug
11:34:46.517 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder] javax.inject:javax.inject is excluded from org.glassfish.hk2:hk2-api:2.3.0-b10(compile) by {"exclude module id" : "javax.inject:javax.inject"}.
잘 소스가 없으므로 다음 두 가지는 로컬 빌드되었습니다.
확실히 exclude 하고 있다.
visitOutgoingDependencies:253
visitOutgoingDependencies:253, NodeState (org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder)
traverseGraph:180, DependencyGraphBuilder (org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder)
resolve:142, DependencyGraphBuilder (org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder)
resolve:123, DefaultArtifactDependencyResolver (org.gradle.api.internal.artifacts.ivyservice.resolveengine)
resolveGraph:175, DefaultConfigurationResolver (org.gradle.api.internal.artifacts.ivyservice)
resolveGraph:86, ShortCircuitEmptyConfigurationResolver (org.gradle.api.internal.artifacts.ivyservice)
resolveGraph:74, ErrorHandlingConfigurationResolver (org.gradle.api.internal.artifacts.ivyservice)
run:612, DefaultConfiguration$7 (org.gradle.api.internal.artifacts.configurations)
execute:402, DefaultBuildOperationExecutor$RunnableBuildOperationWorker (org.gradle.internal.operations)
execute:394, DefaultBuildOperationExecutor$RunnableBuildOperationWorker (org.gradle.internal.operations)
깨달았을 때는 이미 MavenDependencyDescriptor#excludes에 들어 있다
pom.xml of jersey-common
org.glassfish.jersey.core:jersey-common:2.13
하아 과연. . .
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2-api</artifactId>
<version>${hk2.version}</version>
<exclusions>
<exclusion>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
</exclusion>
</exclusions>
</dependency>
실제 장소
io.spring.dependency-management
를 넣었을 때의 거동이 정확하다org.glassfish.jersey.core:jersey-common:2.13
이번 예에서는 org.glassfish.hk2:hk2-api:2.3.0-b10
-> javax.inject:javax.inject:1
-> jersey-common
의 이존이 있지만, hk2-api
(대신에 javax.inject:javax.inject
에의 구현이 말하고 있기 때문에 이것은 이것으로 좋다)Reference
이 문제에 관하여(Gradle 에서 io.spring.dependency-management 를 도입하면 Dependency Tree 가 바뀌어 버렸지만 원래 그쪽이 맞았던 이야기.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kazuki-ma/items/064a6bad3d7762b872fa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)