目前在v2中,如果CorDapp引用模块X(模块X具有与模块Y的传递依赖关系,使得Corda使用Y),如果Corda和X的相应Y版本不同,则可能发生潜在的版本冲突。一个例子是重用现有的内部库,包含业务和序列化逻辑,这取决于Jackson
。
在这种情况下,生成的CorDapp打包和Corda运行时似乎强制执行与Corda相关的Y版本。
如果Y的版本充分不同,我们可以得到X破坏的场景,因为Y不支持某些类型和方法。
是否有一般的方法可以使用gradle配置(或其他一些机制)来限制Y的正确版本以供X使用,而不会影响Corda运行时?
答案 0 :(得分:5)
所以我把它解决了,在这个过程中,终于学到了一些基础知识(来自maven背景)。毫无疑问,以下内容不够优雅,可以更好地推广 - 但它确实有效!
TLDR:
shadowJar
cordapp
子模块使用它们或它们的依赖项与Corda
运行时冲突的依赖项。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'
}
}
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.*:.*:.*'))
}
}
}
现在将deployNodes
的定义更改为而不是取决于jar
任务,而是依赖于每个模块的构建:
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: [':cordapp-contracts-states:jar', ':cordapp:shadowJar']) {
// ... etc
}