• 关于maven依赖关系的问题


    maven可以非常方便的管理jar包依赖问题。

    这几天遇到的问题是:使用maven在idea跑flink程序提示

    java.lang.ClassNotFoundException
    java.lang.NoClassDefFoundError

    开始时通过idea project structure(快捷键Ctrl+Alt+Shift+s)-libraries添加jar包,有很多jar包,通过手动一个个添加不是这么回事呀。

    重新学习廖雪峰老师讲的maven。

    maven本来就可以自己管理包依赖的。那么是maven配置的不对?

    删除.m2目录repository里面所有的文件,在idea右键project-maven-reimport,重新从阿里云下载jar包(需在.m2目录配置settings.xml)。

    此处修改pom.xml <flink.version>1.9.1</flink.version> 的flink版本为1.9.1.

    jar包已经重新下载好。仍然出现NoClassDefFoundError问题。

    查看.m目录已经下载的jar包,flink-streaming-java_2.11-1.9.1.jar有那个类的,为什么没有import呢?

    原来:pom.xml中依赖关系是provided,不是compile。

    <dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-java</artifactId>
    <version>${flink.version}</version>
    <scope>compile</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
    <version>${flink.version}</version>
    <scope>compile</scope>
    </dependency>

    Maven定义了几种依赖关系,分别是compiletestruntimeprovided

    scope说明示例
    compile 编译时需要用到该jar包(默认) commons-logging
    test 编译Test时需要用到该jar包 junit
    runtime 编译时不需要,但运行时需要用到 mysql
    provided 编译时需要用到,但运行时由JDK或某个服务器提供 servlet-api

    其中,默认的compile是最常用的,Maven会把这种类型的依赖直接放入classpath。

    将依赖关系修改为compile,在project右键-maven-reimport,运行程序。至此,问题解决。

    再问:其实这个程序我之前成功运行过多次的,为什么刚开始可以运行成功呢?

    2020.2.1

    调试《基于Apache Flink的流处理》书中的Scala案例(Flink 1.7.1,Scala2.12.8)时报错:

    Error:scalac: Error: java.lang.RuntimeException: /packages cannot be represented as URI
    java.io.IOError: java.lang.RuntimeException: /packages cannot be represented as URI
        at java.base/jdk.internal.jrtfs.JrtPath.toUri(JrtPath.java:176)
        at scala.tools.nsc.classpath.JrtClassPath.asURLs(DirectoryClassPath.scala:213)
        at scala.tools.nsc.classpath.AggregateClassPath.$anonfun$asURLs$1(AggregateClassPath.scala:64)
        at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:244)
        at scala.collection.Iterator.foreach(Iterator.scala:941)
        at scala.collection.Iterator.foreach$(Iterator.scala:941)
    ......

    经过bing搜索,找到https://github.com/scala/scala/releases/tag/v2.12.9

    写到:

    Scala 2.12.9 contains various fixes to improve compatibility with JDK 11, 12, and 13.
    
    Backport upgrade to ASM 7 for JDK 12 compatibility (#7780)
    Fix -release N flag on JDK 12+ (#7763)
    Fix "cannot be represented as URI" on JDK 13 (#8210)
    Add JDK 9 constant types to the ClassfileParser to fix Scaladoc generation issue (#8289)

    于是将IDEA project的Scala SDK换成2.12.9,问题解决。

    替换IDEA project的Scala SDK的方法:

    1、在project右键选择Open Module Settings,选中libraries,+号,Scala SDK,选中一个ivy,download,选择要下载的SDK版本号,本例是2.12.9。

    2、选中Global libraries,+号,Scala SDK,选中ivy 2.12.9.

    3、-号其他版本Scala  SDK。

    启示:解决问题不能蛮干,而要探寻问题和工具的本质,从源头上下手。

    reference:

    https://www.liaoxuefeng.com/wiki/1252599548343744/1309301178105890

    https://blog.csdn.net/qq_24003079/article/details/87920001

    http://wuchong.me/blog/2018/11/07/5-minutes-build-first-flink-application/

    https://github.com/scala/scala/releases/tag/v2.12.9

  • 相关阅读:
    假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为$p = (1+r)^n$ ,其中r为年增长率,n为年数,p为与现在相比的倍数
    不定积分40例
    docker容器
    Kubernetes搭建
    windows提权之mimikatz
    NodeJS沙箱逃逸&&vm
    jwt攻击手段
    yii2邮件配置教程,报Expected response code 250 but got code "553"原因
    git 撤销,放弃本地修改
    动态规划(含最短路径和正则匹配例子)
  • 原文地址:https://www.cnblogs.com/zgq25302111/p/12077807.html
Copyright © 2020-2023  润新知