CorDapps如何处理传递依赖
目前在v2中,如果CorDapp引用模块X,模块X具有对模块Y的传递依赖性,使得Corda使用Y,则如果Corda和X的Y的相应版本不同,则可能发生潜在的版本冲突.一个例子是重用现有的内部库,包含依赖于Jackson的业务和序列化逻辑.
在这种情况下,生成的CorDapp打包和Corda运行时似乎强制执行与Corda相关的Y版本. 如果Y的版本充分不同,我们可以得到X破坏的场景,因为Y不支持某些类型和方法. 是否有一般方法可以使用gradle配置(或其他一些机制)来限制Y的正确版本以供X使用,而不会影响Corda运行时?
所以我解决了这个问题,并在此过程中,终于学到了一些基础知识(来自maven背景).毫无疑问,以下内容不够优雅,可以更好地推广 – 但它确实有效!
假设 >你正在使用当前的v2 kotlin cordapp template 解 1.添加shadowJar引用 在根build.gradle文件中添加以下内容 classpath’com.github.jengelman.gradle.plugins:shadow:2.0.2′ 到buildscript依赖项: 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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |