首页 文章

CorDapps如何处理传递依赖

提问于
浏览
4

目前在v2中,如果CorDapp引用模块X,模块X具有对模块Y的传递依赖性,使得Corda使用Y,则如果Corda和X的相应Y版本不同,则可能发生潜在的版本冲突 . 一个例子是重用现有的内部库,包含业务和序列化逻辑,这取决于 Jackson .

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

如果Y的版本充分不同,我们可以得到X破坏的场景,因为Y不支持某些类型和方法 .

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

1 回答

  • 5

    所以我解决了这个问题,并在此过程中,终于学到了一些基础知识(来自maven背景) . 毫无疑问,以下内容不够优雅,可以更好地推广 - 但它确实有效!

    TLDR:shadowJar

    假设

    • 你正在使用当前的v2 kotlin cordapp template

    • cordapp 子模块使用它们或它们的依赖项与 Corda 运行时冲突的依赖项 .

    解决方案

    1.添加shadowJar引用

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

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

    buildscript dependencies

    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 
    }
    

相关问题