前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决 flink 本地执行和集群执行依赖问题

解决 flink 本地执行和集群执行依赖问题

原创
作者头像
earthchen
修改2021-05-28 09:59:00
1.9K0
修改2021-05-28 09:59:00
举报
文章被收录于专栏:earthchen的专栏

背景

flink 在本地开发和提交到集群时的依赖是不同的,本地因为需要执行,所以一些依赖在本地是需要的,在部署到集群中是不需要的。

maven 中有一个叫 profile 的东西,但由于我使用的是 gradle 中,并没有这个功能,所以需要另外想办法

过程

方案1

首先先尝试了一下在 gradle 中设置一个变量,然后在执行打包task 时去更新这个字段去选择相应的依赖

代码语言:txt
复制
def prod=false

def conditionDependencies = [

 "org.apache.flink:flink-table:${flinkVersion}",

 "org.apache.flink:flink-table-api-java:${flinkVersion}",

 "org.apache.flink:flink-table-api-java-bridge\_${scalaBinaryVersion}:${flinkVersion}",

 "org.apache.flink:flink-table-planner-blink\_${scalaBinaryVersion}:${flinkVersion}",

 "org.apache.flink:flink-table-planner\_${scalaBinaryVersion}:${flinkVersion}",

 "org.apache.flink:flink-clients\_${scalaBinaryVersion}:${flinkVersion}",

_//        "ch.qos.logback:logback-core:1.2.3",_

_//        "ch.qos.logback:logback-classic:1.2.3"_

]

dependencies {

 print("----当前prod=${prod}-------")

 if (prod) {

 compileOnly(conditionDependencies)

    } else {

 implementation(conditionDependencies)

    }

}

shadowJar {

        prod=true

 mergeServiceFiles()

}

按上述配置去执行时,发现不行,在执行shadowJar的 task 时,发现dependencies块会比这个 task 先执行,所以就还是会含有相关依赖

方案2

和方案1一样,主要是去解决 prod 变量的赋值顺序问题,只要我们能够在执行所有 task 之前让他获取到合适的值,此时就可以完成

那么,怎么让它可以执行任务时候就拿到呢?想到了环境变量,在执行 gradlew 命令时后面可以传参,然后在 gradle.build 中获取,就可以实现了

代码语言:txt
复制
_// 使用传递的属性_

def prod = System.getProperty("prod") ?: false;

def conditionDependencies = [

 "org.apache.flink:flink-table:${flinkVersion}",

 "org.apache.flink:flink-table-api-java:${flinkVersion}",

 "org.apache.flink:flink-table-api-java-bridge\_${scalaBinaryVersion}:${flinkVersion}",

 "org.apache.flink:flink-table-planner-blink\_${scalaBinaryVersion}:${flinkVersion}",

 "org.apache.flink:flink-table-planner\_${scalaBinaryVersion}:${flinkVersion}",

 "org.apache.flink:flink-clients\_${scalaBinaryVersion}:${flinkVersion}",

_//        "ch.qos.logback:logback-core:1.2.3",_

_//        "ch.qos.logback:logback-classic:1.2.3"_

]

dependencies {

 print("----当前prod=${prod}-------")

 if (prod) {

 compileOnly(conditionDependencies)

    } else {

 implementation(conditionDependencies)

    }

}

shadowJar {

 mergeServiceFiles()

}

修改后,在本地执行main 方法时,就含有上述依赖,在打包时,执行下列命令传递 prod 参数

代码语言:txt
复制
gradlew -Dprod=true :spendreport-table:shadowJar

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 过程
    • 方案1
      • 方案2
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档