Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CorDapps如何处理可传递依赖关系_Corda - Fatal编程技术网

CorDapps如何处理可传递依赖关系

CorDapps如何处理可传递依赖关系,corda,Corda,当前在v2中,如果CorDapp引用模块X,该模块X与模块Y具有可传递依赖关系,因此Corda使用Y,则如果Corda和X的Y的各自版本不同,则可能会发生版本冲突。一个例子是重用现有的内部库,其中包含业务和序列化逻辑,这取决于Jackson 在本例中,生成的CorDapp打包和Corda运行时似乎强制执行与Corda相关的Y版本 如果Y的版本差异很大,我们可以得到X中断这样的场景,因为Y不支持某些类型和方法 有没有一种通用的方法可以使用gradle配置(或其他一些机制)来限制X使用Y的正确版本,

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

在本例中,生成的CorDapp打包和Corda运行时似乎强制执行与Corda相关的Y版本

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


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

因此我解决了这个问题,并在这个过程中,最终学习了一些gradle基础知识(来自maven背景)。毫无疑问,下面的内容不雅观,可以推广得更好——但它确实有效

TLDR:
shadowJar

假设
  • 你用的是电流
  • cordapp
    子模块使用依赖项,这些依赖项或其依赖项与
    Corda
    运行时冲突
解决方案 1.添加
shadowJar
引用 在根
build.gradle
文件中添加以下内容

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

构建脚本
依赖项

buildscript {
// ...
    dependencies {
// ...
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
    }
}
2.将
shadowJar
任务添加到
cordapp
cordapp
项目中,应用
shadowJar
插件

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

然后添加调用参数化:

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依赖项进行着色。
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: [':cordapp-contracts-states:jar', ':cordapp:shadowJar']) {
// ... etc 
}