【问题标题】:How can CorDapps deal with transitive dependenciesCorDapps 如何处理传递依赖
【发布时间】:2018-07-16 15:42:29
【问题描述】:

当前在 v2 中,如果 CorDapp 引用模块 X,该模块对模块 Y 具有传递依赖关系,因此 Corda 使用 Y,如果 Corda 和 X 各自的 Y 版本不同,则可能发生潜在的版本冲突.一个例子是重用现有的内部库,包含业务和序列化逻辑,它依赖于Jackson

在这种情况下,生成的 CorDapp 打包和 Corda 运行时似乎强制执行与 Corda 相关的 Y 版本。

如果 Y 的版本差异很大,我们可以得到 X 破坏这样的场景,因为 Y 不支持某些类型和方法。

是否有一种通用方法可以使用 gradle 配置(或其他一些机制)来限制 Y 的正确版本以供 X 使用,而不影响 Corda 运行时?

【问题讨论】:

    标签: corda


    【解决方案1】:

    所以我解决了这个问题,在这个过程中,终于学会了一些 gradle 基础知识(来自 maven 背景)。毫无疑问,以下内容是不雅的,可以更好地概括 - 但它有效!

    TLDR:shadowJar

    假设

    • 您正在使用当前的v2 kotlin cordapp template
    • cordapp 子模块使用它们或其依赖项与 Corda 运行时发生冲突的依赖项。

    解决方案

    1。添加shadowJar 参考

    在根build.gradle 文件中添加以下内容

    classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'

    buildscriptdependencies

    buildscript {
    // ...
        dependencies {
    // ...
            classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
        }
    }
    

    2。将shadowJar 任务添加到cordapp

    cordapp 项目中,应用shadowJar 插件。

    请注意:我需要把它放在所有现有插件之前才能工作。

    apply plugin: 'com.github.johnrengelman.shadow'
    apply plugin: 'kotlin'
    // ... etc
    

    然后添加调用参数化:

    tasks {
        shadowJar {
            mergeServiceFiles()
    
            // Place your shaded packages here!
    
            relocate 'io.netty', 'shadow.io.netty'
            relocate 'com.fasterxml', 'shadow.com.fasterxml'
    
            configurations = [project.configurations.compile]
            baseName = jar.baseName + "-" + jar.version
            classifier = null
            version = null
            dependencies {
                include(dependency(".*:.*:.*"))
                exclude(dependency('org.jetbrains.kotlin:.*:.*'))
                exclude(dependency('net.corda:.*:.*'))
                exclude(dependency('org.apache.logging.*:.*:.*'))
                exclude(dependency('org.apache.activemq:.*:.*'))
                exclude(dependency('com.google.*:.*:.*'))
                exclude(dependency('io.reactivex:.*:.*'))
                exclude(dependency('org.bouncycastle.*:.*:.*'))
                exclude(dependency('org.glassfish.*:.*:.*'))
                exclude(dependency('co.paralleluniverse.*:.*:.*'))
                exclude(dependency('co.paralleluniverse.*:.*:.*'))
                exclude(dependency('com.typesafe.*:.*:.*'))
                exclude(dependency('com.esotericsoftware.*:.*:.*'))
                exclude(dependency('org.qpid.*:.*:.*'))
            }
        }
    }
    

    3。更改构建依赖项

    现在将deployNodes 的定义更改为依赖于jar 任务,而是依赖于每个模块的构建:

    task deployNodes(type: net.corda.plugins.Cordform, dependsOn: [':cordapp-contracts-states:jar', ':cordapp:shadowJar']) {
    // ... etc 
    }
    

    【讨论】:

    • 值得注意的是,自从我发表这篇文章以来,我不得不排除更多不必要的依赖项。我已经在上面添加了这些。如果 Corda 可以在单独的模块中分离出接口和实现,所有这一切可能会更容易。或者,如果 CordFormation 可以选择隐藏 cordapp 依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2021-01-04
    • 2012-06-14
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多