CorDapps如何处理传递依赖

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

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

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

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

所以我做了这个,在这个过程中,终于学到了一些gradle基础知识(来自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' } } 

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 { // Exclude Corda modules from shaded fatjar! exclude(dependency('net.corda:.*:.*')) } } } 

3.改变构建依赖关系

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

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