CorDapps如何处理传递依赖

前端之家收集整理的这篇文章主要介绍了CorDapps如何处理传递依赖前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前在v2中,如果CorDapp引用模块X,模块X具有对模块Y的传递依赖性,使得Corda使用Y,则如果Corda和X的Y的相应版本不同,则可能发生潜在的版本冲突.一个例子是重用现有的内部库,包含依赖于Jackson的业务和序列化逻辑.

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

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

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

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

TLDR: shadowJar

假设

>你正在使用当前的v2 kotlin cordapp template
> cordapp子模块使用它们或它们的依赖项与Corda运行时冲突的依赖项.

1.添加shadowJar引用

在根build.gradle文件添加以下内容

classpath’com.github.jengelman.gradle.plugins:shadow:2.0.2′

到buildscript依赖项:

  1. buildscript {
  2. // ...
  3. dependencies {
  4. // ...
  5. classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
  6. }
  7. }

2.将shadowJar任务添加到cordapp

在cordapp项目中,应用shadowJar插件.

Please Note: I needed to put this before all existing plugins for it to work.

  1. apply plugin: 'com.github.johnrengelman.shadow'
  2. apply plugin: 'kotlin'
  3. // ... etc

然后添加调用参数化:

  1. tasks {
  2. shadowJar {
  3. mergeServiceFiles()
  4.  
  5. // Place your shaded packages here!
  6.  
  7. relocate 'io.netty','shadow.io.netty'
  8. relocate 'com.fasterxml','shadow.com.fasterxml'
  9.  
  10. configurations = [project.configurations.compile]
  11. baseName = jar.baseName + "-" + jar.version
  12. classifier = null
  13. version = null
  14. dependencies {
  15. include(dependency(".*:.*:.*"))
  16. exclude(dependency('org.jetbrains.kotlin:.*:.*'))
  17. exclude(dependency('net.corda:.*:.*'))
  18. exclude(dependency('org.apache.logging.*:.*:.*'))
  19. exclude(dependency('org.apache.activemq:.*:.*'))
  20. exclude(dependency('com.google.*:.*:.*'))
  21. exclude(dependency('io.reactivex:.*:.*'))
  22. exclude(dependency('org.bouncycastle.*:.*:.*'))
  23. exclude(dependency('org.glassfish.*:.*:.*'))
  24. exclude(dependency('co.paralleluniverse.*:.*:.*'))
  25. exclude(dependency('co.paralleluniverse.*:.*:.*'))
  26. exclude(dependency('com.typesafe.*:.*:.*'))
  27. exclude(dependency('com.esotericsoftware.*:.*:.*'))
  28. exclude(dependency('org.qpid.*:.*:.*'))
  29. }
  30. }
  31. }

3.改变构建依赖性

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

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

猜你在找的设计模式相关文章