Intellij:基于 SBT 的 Scala 项目不使用 Java 9 构建

Intellij: SBT-based Scala project does not build with Java 9

我已经尝试将基于 Scala/sbt 的项目切换到 Java 9。 如果我用 sbt 编译项目,它就可以工作。

如果我尝试使用 IntelliJ 的构建选项构建项目,我会立即收到错误

Error:Module 'xyz' production: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

我尝试将模块添加为依赖项

libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.0"

并添加到 IntelliJ 的编译器设置中(javac 以及 scala 编译器)

  <option name="ADDITIONAL_OPTIONS_STRING" value="--add-modules java.xml.bind" />

但不幸的是没有帮助。

除非有明确的解决方案,否则将此作为一个临时建议作为答案移动并结合其他几点。

好像是 is not yet complete in terms of readiness to be used with JDK-9 as visible at scala/scala-dev - Support JDK 9


另一方面,解决对javax.xml.bind的依赖的方式目前可以分为两类:-

  • 您的项目使用了一个库,而该库又 requires javax.xml.bind,在这种情况下,除了在重组之前等待该库移动到模块化结构之外,您手上没有太多东西.但是,这可以通过作为编译器参数提供的 --add-modules javax.xml.bind 选项暂时破解。

  • 您的项目直接使用了 javax.xml.bind。在这种情况下,理想的解决方案是离开模块并利用依赖项 [jaxb-api:2.3.0] 并相应地重构代码。

除了@nullpointer 回答外,简短说明如何使用--add-modules

打开File -> Settings -> Build, Execution, Deployment -> Compiler, 并将 --add-modules java.xml.bind 添加到 Shared build process VM options

  1. 打开[文件 -> 设置 -> 构建、执行、部署 -> 编译器]
  2. 添加“--add-modules java.se.ee”到[Shared build process VM options ]

除以上答案外

如果您没有使用 IntelliJ 和 运行 来自 sbt 控制台的程序,我发现以下解决了问题:

  • 将以下内容添加到您的 build.sbt:

    libraryDependencies += "javax.xml.bind" % "jaxb-api" % "2.3.0"

  • 将导入语句添加到您的控制器:

    进口javax.xml._