2017-12-27 904 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錯誤

相關問題