有两个原因导致 sbt 没有将所需的工件添加到类路径中,因此编译失败。
第一个原因是,默认情况下,sbt 只识别包装类型有限的工件(jar、bundle 等等)。为了告诉 sbt 我们对打包类型为 maven-plugin 的工件感兴趣,我们需要明确地告诉我们想要从依赖项中获得哪些工件:
libraryDependencies += ("net.alchim31.maven" % "scala-maven-plugin" % "3.3.1")
.withExplicitArtifacts(Vector("scala-maven-plugin", "maven-plugin", "jar"))
完成此操作后,我们可以通过在consoleProject 中运行以下代码来确认 sbt 确实获得了我们的工件:
Keys.update.in(myScope).in(myProject).eval.allFiles
.find(_.getAbsolutePath.contains("net"))
注意myScope 必须是Compile、Test 或Runtime(通常是Compile)并且myProject 必须是对您已在其中声明依赖项的项目的引用。上一次操作的结果,如果一切顺利的话,将会是Some(...),表示该神器确实被解析并检测到了。
但是,我们还没有完成。如果我们从 sbt shell 运行 myProject/dependencyClasspath,我们将不会在那里看到我们的工件。这是需要第二步的地方:我们需要将新的打包类型添加到classpathTypes,以便 sbt 将工件添加到我们的编译类路径中。
classpathTypes += "maven-plugin"
完成所有这些后,我们应该运行 myProject/dependencyClasspath 并查看我们的工件。
但故事还没有结束,我们进入了“bug”领域。 Sbt 不会自动将classpathTypes 中的打包类型添加到负责在 pom 文件中声明依赖关系的 pom 配置中。请注意,否则您的应用程序将失败并出现 ClassNotFoundException 或类似问题,因为并非所有相关工件都已解析并加载类。
所以为了有一个工作的应用程序,你需要自己做:
makePomConfiguration :=
makePomConfiguration.value.withIncludeTypes(classpathTypes.value)
默认情况下没有这样做,这只是 1.x 中的一个 sbt 错误。