CorDapps如何处理传递依赖

daz*_*raf 4 corda

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

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

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

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

daz*_*raf 5

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

TLDR: shadowJar

假设

  • 你正在使用当前的v2 kotlin cordapp模板
  • 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'
    }
}
Run Code Online (Sandbox Code Playgroud)

2.添加shadowJar任务到cordapp

cordapp项目中,应用shadowJar插件.

请注意:我需要在所有现有插件之前将其放在工作中.

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'kotlin'
// ... etc
Run Code Online (Sandbox Code Playgroud)

然后添加调用参数化:

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.*:.*:.*'))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3.更改构建依赖项

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

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