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


  • htps : // 레포 1. 글쎄. 2.3.0-b10 / 2.3.0-b10. Pom

  • //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 시도



    잘 소스가 없으므로 다음 두 가지는 로컬 빌드되었습니다.
  • htps : // 기주 b. 코 m / g 등 dぇ / g 등 dぇ
  • htps : // 기주 b. 코 m / sp 린 g-g 등 d ぇ p ㎅ 긴 s /



  • 확실히 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
  • Parent: org.glassfish.jersey:project: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를 넣었을 때의 거동이 정확하다
  • gradle 단독이라면 exclude는 읽지만 의존 도중에 dependencyManagement를 고려하지 않습니다
  • 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 에의 구현이 말하고 있기 때문에 이것은 이것으로 좋다)
  • 한층 더 말하면, 이 dependencyManagement 가 parent pom 에 들어가 있기 때문에 빠졌다. . . org.glassfish.jersey:project:2.13

  • 좋은 웹페이지 즐겨찾기