簡體   English   中英

SBT:插件依賴項和項目類路徑

[英]SBT: Plugin dependencies and project classpath

如何將外部依賴項添加到SBT插件並使其在項目和插件類路徑中均可用?

具體來說,我有一個簡單的插件,可以運行我們的TestNG測試套件並進行一些后期處理。 這是一個簡化的版本:

import sbt._
import java.util.ArrayList
import Keys._
import org.testng._

object RunTestSuitesPlugin extends Plugin {
  lazy val runTestSuites = TaskKey[Unit]("run-test-suites", "runs TestNG test suites")
  lazy val testSuites = SettingKey[Seq[String]]("test-suites", "list of test suites to run")

  class JavaListWrapper[T](val seq: Seq[T]) {
    def toJavaList = seq.foldLeft(new java.util.ArrayList[T](seq.size)) { (al, e) => al.add(e); al }
  }
  implicit def listToJavaList[T](l: Seq[T]) = new JavaListWrapper(l)

  def runTestSuitesTask = runTestSuites <<= (target, streams, testSuites) map {
    (targetDirectory, taskStream, suites) =>
      import taskStream.log
      log.info("running test suites: " + suites)
      runSuites(suites)
  }

  private def runSuites(testSuites: Seq[String]) = {
    var tester = new TestNG
    tester.setTestSuites(testSuites.toJavaList)
    tester.run()
  }

  def testSuiteSettings = {
    inConfig(Compile)(Seq(
      runTestSuitesTask,
      testSuites := Seq("testsuites/mysuite.xml"),
      libraryDependencies += "org.testng" % "testng" % "5.14"))
  }
}

問題是,當我將此插件添加到項目中並使用run-test-suites運行它時,即使顯示full-classpath表明testng.jar在目錄中,但仍會出現java.lang.NoClassDefFoundError:org / testng / TestNG失敗。類路徑。

因此,執行插件時使用的類路徑與我的項目中的類路徑有所不同,那么如何使插件依賴關系同時出現在兩個地方?

我會嘗試一個答案,但是我對sbt的內部細節不是很熟悉。

通常情況下,構建系統(而不是你的程序)的路徑下的項目,如解釋在這里 那通常在project/plugins.sbt 聽起來不錯,因為您開發的應用程序沒有理由要與構建系統使用的庫有關,也不必與之相反。

當您的插件運行應用程序代碼時,可能不是那么簡單,並且可能存在類路徑/類加載器問題。 我不確定它是否會起作用。 通常,您的插件應實施測試框架,而不是定義自己的任務。 sbt 測試的文檔非常有限。

測試框架應在test-interface中實現org.scalatools.testing.Framework 添加后,您的構建將考慮到它

testFrameworks += new TestFramework("full.class.name")

當您運行普通的測試命令時,它將使每個框架都能識別其處理的測試類(兩個可用的標准:擴展某些基類或具有一些注釋)並運行它們。 該框架在構建中運行,它被賦予一個類加載器來訪問應用程序代碼。

您可以看看junit的框架實現 (隨sbt一起提供)。 還有一個TestNG實現 我不知道,根據其文檔,它有點不合常規,希望它對您有用。

通過將TestNG直接添加到使用該插件的項目中的Compile中的unmanagedJars中 ,可以修復該錯誤。

我沒有找到任何資源來解釋插件執行期間SBT類路徑的結構,因此,非常感謝您嘗試解釋為什么需要此步驟的任何嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM