爲什麼有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"))
一旦我們做到了這一點,我們可以確認SBT通過運行下面的代碼在consoleProject
確實讓我們的神器:
Keys.update.in(myScope).in(myProject).eval.allFiles
.find(_.getAbsolutePath.contains("net"))
注意myScope
必須是Compile
,Test
或Runtime
(通常,這是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錯誤