尝试使用2.13版测试创建Scala插件,得到java.lang.NoClassDefFoundError sclaaSerializable

km0tfn4u  于 2023-06-29  发布在  Scala
关注(0)|答案(1)|浏览(196)

尝试遵循SBT插件教程时遇到此错误

java.lang.NoClassDefFoundError: scala/Serializable
[error] sbt.std.InputWrapper$.valueMacroImpl(InputWrapper.scala:136)
[error] java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] java.base/java.lang.reflect.Method.invoke(Method.java:566)
[error] scala.reflect.macros.runtime.JavaReflectionRuntimes$JavaReflectionResolvers.$anonfun$resolveJavaReflectionRuntime$6(JavaReflectionRuntimes.scala:51)

值得注意的是:我尝试使用scala的更新版本,版本“2.13.11”,出版商使用的是“2.10.4”。
我遗漏了什么,或者2.13 Scala遗漏了什么,会导致这种情况?解决办法是什么?

xdyibdwo

xdyibdwo1#

正如@LuisMiguelMejíaSuárez所说,问题在于你使用的scala版本。
有一个关于Cannot compile SBT plugin under Scala 2.13.0的问题已经关闭。回购的维护者说
SBT插件应该像这样创建:

lazy val root = (project in file("."))
  .enablePlugins(SbtPlugin)  
  .settings(
    name := "sbt-something"
  )

和Scala版本不应该指定,除非你是在sbt 1.x和0.13之间交叉构建。在2.13.0下没有可用的sbt,所以期望没有意义。
在文档Sbt - Creating an auto plugin中也有解释

*sbt插件必须使用Scala 2.12.x进行编译,sbt本身就是在其中编译的。通过不指定scalaVersion,sbt将默认为适合插件的Scala版本。

在上面提到的sbt问题中评论的一个用户创建了一个sbt 1.x hello world,您可以看到它被用作创建自动插件中所示示例的 * 主页 *。

ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
ThisBuild / homepage := Some(url("https://github.com/sbt/sbt-hello"))

lazy val root = (project in file("."))
  .enablePlugins(SbtPlugin)
  .settings(
    name := "sbt-hello",
    pluginCrossBuild / sbtVersion := {
      scalaBinaryVersion.value match {
        case "2.12" => "1.2.8" // set minimum sbt version
      }
    }
  )

相关问题