SBT、MAVEN、IVY的区别与联系

目录

java.lang.NoClassDefFoundError: scala/reflect/internal/Trees

SBT、MAVEN、IVY的区别与联系

参考文献

 

java.lang.NoClassDefFoundError: scala/reflect/internal/Trees

用maven写Scala程序的时候,报以下错误。

Error:scalac: Error: scala/reflect/internal/Reporter
java.lang.NoClassDefFoundError: scala/reflect/internal/Reporter
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
	at java.lang.Class.getMethod0(Class.java:3018)
	at java.lang.Class.getMethod(Class.java:1784)
	at sbt.compiler.RawCompiler.apply(RawCompiler.scala:25)
	at sbt.compiler.AnalyzingCompiler$$anonfun$compileSources$1$$anonfun$apply$2.apply(AnalyzingCompiler.scala:146)
	at sbt.compiler.AnalyzingCompiler$$anonfun$compileSources$1$$anonfun$apply$2.apply(AnalyzingCompiler.scala:142)
	at sbt.IO$.withTemporaryDirectory(IO.scala:291)
	at sbt.compiler.AnalyzingCompiler$$anonfun$compileSources$1.apply(AnalyzingCompiler.scala:142)
	at sbt.compiler.AnalyzingCompiler$$anonfun$compileSources$1.apply(AnalyzingCompiler.scala:139)
	at sbt.IO$.withTemporaryDirectory(IO.scala:291)
	at sbt.compiler.AnalyzingCompiler$.compileSources(AnalyzingCompiler.scala:139)
	at sbt.compiler.IC$.compileInterfaceJar(IncrementalCompiler.scala:52)
	at org.jetbrains.jps.incremental.scala.local.CompilerFactoryImpl$.getOrCompileInterfaceJar(CompilerFactoryImpl.scala:96)
	at org.jetbrains.jps.incremental.scala.local.CompilerFactoryImpl$$anonfun$getScalac$1.apply(CompilerFactoryImpl.scala:50)
	at org.jetbrains.jps.incremental.scala.local.CompilerFactoryImpl$$anonfun$getScalac$1.apply(CompilerFactoryImpl.scala:49)
	at scala.Option.map(Option.scala:146)
	at org.jetbrains.jps.incremental.scala.local.CompilerFactoryImpl.getScalac(CompilerFactoryImpl.scala:49)
	at org.jetbrains.jps.incremental.scala.local.CompilerFactoryImpl.createCompiler(CompilerFactoryImpl.scala:22)
	at org.jetbrains.jps.incremental.scala.local.CachingFactory$$anonfun$createCompiler$1.apply(CachingFactory.scala:24)
	at org.jetbrains.jps.incremental.scala.local.CachingFactory$$anonfun$createCompiler$1.apply(CachingFactory.scala:24)
	at org.jetbrains.jps.incremental.scala.local.Cache$$anonfun$getOrUpdate$2.apply(Cache.scala:20)
	at scala.Option.getOrElse(Option.scala:121)
	at org.jetbrains.jps.incremental.scala.local.Cache.getOrUpdate(Cache.scala:19)
	at org.jetbrains.jps.incremental.scala.local.CachingFactory.createCompiler(CachingFactory.scala:23)
	at org.jetbrains.jps.incremental.scala.local.LocalServer.compile(LocalServer.scala:22)
	at org.jetbrains.jps.incremental.scala.remote.Main$.make(Main.scala:68)
	at org.jetbrains.jps.incremental.scala.remote.Main$.nailMain(Main.scala:25)
	at org.jetbrains.jps.incremental.scala.remote.Main.nailMain(Main.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.martiansoftware.nailgun.NGSession.run(NGSession.java:319)
Caused by: java.lang.ClassNotFoundException: scala.reflect.internal.Reporter
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 46 more

对于这个问题,经过搜索答案,我尝试着删掉了~/.ivy2路径下的文件,似乎是因为idea默认使用的是这个路径下的依赖?但又会报另一个新错误:

Error:scalac: error while loading package, class file '/usr/local/Cellar/maven/3.6.0/libexec/conf/repository/org/scala-lang/scala-library/2.13.1/scala-library-2.13.1.jar(scala/collection/immutable/package.class)' is broken
(class java.lang.RuntimeException/error reading Scala signature of package.class: Scala signature package has wrong version
 expected: 5.0
 found: 5.2 in package.class)

 看报错信息,是因为版本不对的问题,这是因为Spark和scala之间有版本对应关系:

 可以看到Scala-2.12对应的spark版本是2.4.5,而我使用的是2.1.1版本,所以需要将scala版本换回2.11。但是之后紧接着又报这个错误:

java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;

这又是因为Scala-sdk版本不一致导致,将scala-sdk也换成2.11版本。

 另外需要注意的是,在Modules要将2.11.8版本上移,不然依然使用的之前的版本。

 

SBT、MAVEN、IVY的区别与联系

SBT、MAVEN、IVY经常一起出现,但之前一直没有具体去了解他们都是些什么。

SBT 是 Scala 的构建工具,全称是 Simple Build Tool, 类似 Maven 或 Gradle。

Maven2,它是一个模块化项目构建工具(Building a Project )。它能够管理依赖、构建周期、测试、 打包并且在仓库中发布你的制品。它是一个项目构建工具,领先于通常的构建工具(实际上它的第一个版本是在Ant之上的一层)。
Apache ivy2对项目依赖的文件可以进行统一的管理,依赖于ant,它是一个管理(记录、跟踪、解析和报告)项目依赖的工具 (dependency tool)。

Maven 2和Ivy常被放在一起对比,但实际上两者是不同类型的工具。Ivy仅提供依赖管理功能,但是Maven 2是一个软件项目管理综合工具,能够管理构建、报告、文档,以及根据中心化的信息来管理依赖。Ant和Ivy 2.0集成在一起,与Maven 2进行比较才比较合适。

两个工具处理冲突管理(Conflict management)的方式是不同的,冲突管理指处理传递依赖时解决冲突的能力。Ivy允许由模块定制冲突管理器和规则,而Maven 2的冲突管理则基于最近的定义(也就是说,一个模块依赖于foo 1.0,这会导致模块的所有依赖都不能使用foo 1.1)。

Maven 2通过一个叫阶段(scope)的概念来处理其中的依赖配置。在Maven 2中,一个依赖只在定义它的测试阶段或构建阶段有效。Ivy能够创建多配置映射,这些映射可将每个配置(需构建工件的声明)与其它模块的依赖绑定在一起,以此提供了更多的定制选项。

Maven 2关于依赖管理的文档很有限,相对于此,Ivy的文档内容更宽泛,包含大量的例子和指南,同时包括FAQ。有些企业不能使用公共仓库,并在基于Ant的构建系统中有大量投资,对于这样的企业来说,Ivy支持企业仓库的创建、与Ant紧密集成,这些附加的特征都使Ivy成为能替代Maven 2的依赖管理工具。

参考文献

[1]https://stackoverflow.com/questions/25126238/java-lang-noclassdeffounderror-scala-reflect-internal-trees

[2]https://issues.sonatype.org/browse/MVNCENTRAL-485

[3]http://ant.apache.org/ivy/history/2.0.0/settings/caches.html

[4]https://zhuanlan.zhihu.com/p/85849204

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scala是一种运行在Java虚拟机上的编程语言,具有面向对象和函数式编程的特性。要进行Scala的开发,首先需要配置好开发环境。 首先,需要安装Java开发工具包(JDK)。可以从Oracle官网下载并按照指示进行安装。安装完成后,可以通过在命令行中输入java -version来检查是否安装成功。 接下来,需要安装Scala编译器。可以从Scala官网下载并按照指示进行安装。完成后,同样可以通过在命令行中输入scala -version检查是否安装成功。 为了方便管理项目依赖和构建项目,可以选择使用sbt或者maven。下面分别介绍它们的配置教程。 对于sbt的配置,首先需要下载并安装sbt。可以从sbt官网下载并安装。安装完成后,可以在命令行中输入sbt来验证是否安装成功。 创建一个新项目时,需要在项目根目录中创建一个build.sbt文件。在该文件中,可以指定项目的名称、版本号、依赖项等信息。 对于maven的配置,首先需要下载并安装maven。可以从maven官网下载并安装。安装完成后,同样可以在命令行中输入mvn来验证是否安装成功。 创建一个新项目时,需要在项目根目录中创建一个pom.xml文件。在该文件中,可以指定项目的名称、版本号、依赖项等信息。 以上是关于Scalasbtmaven的配置教程的简单介绍。具体的配置细节和更多使用方法,可以参考官方文档或者在线教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值