2017-12-27 915 views
0

在我的例子中,我需要解决一个依赖项,其工件没有传统的jar作为打包类型,而是maven-plugin(更具体地说,我感兴趣的工件是Maven插件)。这在Maven land中是通过<packaging> XML标签指定的。如何解决sbt中具有不同包装常春藤类型的依赖关系?

当我添加插件时,我的项目依赖于sbt构建,sbt成功更新项目,但已解析的依赖项不在类路径中。我如何获得sbt来将工件添加到我的类路径中,以便依赖于这种依赖关系的代码编译?我用的Maven插件添加到我的构建

代码:

libraryDependencies += "net.alchim31.maven" % "scala-maven-plugin" % "3.3.1" 

回答

0

为什么有SBT不想要的神器添加到类路径,因此编译失败有两个原因。

第一个原因是,默认情况下,sbt只识别包装类型有限的工件(jarbundle以及其他几个)。为了告诉SBT我们感兴趣的工件,其封装类型为maven-plugin,我们需要明确地告诉我们想要的文物从与依赖:

libraryDependencies += ("net.alchim31.maven" % "scala-maven-plugin" % "3.3.1") 
    .withExplicitArtifacts(Vector("scala-maven-plugin", "maven-plugin", "jar")) 

一旦我们做到了这一点,我们可以确认SBT通过运行下面的代码在consoleProject确实让我们的神器:

Keys.update.in(myScope).in(myProject).eval.allFiles 
    .find(_.getAbsolutePath.contains("net")) 

注意myScope必须是CompileTestRuntime(通常,这是Compile)和myProject必须是一个参考,如果一切顺利,前一个操作的结果将是Some(...),这表明工件确实已解析并检测到。

但是,我们没有完成。如果我们运行myProject/dependencyClasspath,这次从sbt shell中,我们不会在那里看到我们的工件。这是第二步需要的地方:我们需要将我们的新包装类型添加到classpathTypes,以便sbt将工件添加到我们的编译类路径中。

classpathTypes += "maven-plugin" 

这一切的实现,我们应该运行myProject/dependencyClasspath,看看我们的神器存在。

但故事还没有结束,在这里我们进入“bug”领域。 Sbt不会自动将classpathTypes中的打包类型添加到负责在pom文件中声明依赖关系的pom配置中。请注意,否则,您的应用程序将因ClassNotFoundException或类似问题而失败,因为并非所有相关工件都已解析和分类。

所以为了有一个工作的应用程序,你需要自己做:

makePomConfiguration := 
    makePomConfiguration.value.withIncludeTypes(classpathTypes.value) 

,这是不是默认设置的事实,它只是在1.x中的SBT错误

相关问题