2014-03-25 48 views
0

在我的plugin中,我需要從外部JAR執行靜態引導方法以執行分析。目前我直接從MutationCoverageReport.main(arg)的代碼中調用它,但這迫使我在插件中創建一個編譯時依賴項,它是hard在執行插件時修改(選擇不同的JAR版本)。使用Gradle插件中的單獨類路徑執行Java類

我想使用反射調用它,並發現一些Gradle代碼中的示例,如WorkerProcessBuilderJavaExecHandleBuilder。儘管如此,他們在org.gradle.process.internal包,我不確定是否建議使用它從外部插件。

問題。 Gradle插件使用指定的類路徑從外部類運行任意Java方法的推薦方法是什麼?

順便說一句,我寧願不使用Ant任務,因爲它是一個單獨的項目和另一個抽象層,其潛在的錯誤和侷限性。

回答

1

有一對夫婦,你可能需要在外部罐來調用main方法的方法:

  1. 使用JavaExec任務,或利用了project.javaexec方法的自定義任務。
  2. 將外部Jar放置在構建腳本類路徑上,並直接或反射地從自定義任務調用其主要方法。外部Jar可能是插件Jar的傳遞依賴。或者,也可以讓用戶將外部Jar放置在構建腳本類路徑(buildscript { dependencies { classpath ... } })上。
  3. 編寫一個自定義任務,創建自己的類加載器,將外部Jar放在它上面,並反射地調用其主要方法。

第一種方法將在單獨的JVM中運行代碼,這通常是可取的。第二種和第三種方法也可以調用主方法以外的方法。在第一種或第三種方法中,插件可以添加一個允許用戶通過聲明dependencies塊中的依賴關係來提供外部Jar的配置。 (該插件可以提供默認的依賴關係。)這是許多內置的Gradle插件所做的,例如代碼質量插件(checkstyle等)。你可能想研究他們的代碼來獲得一些啓發。

外部插件只能使用Gradle的公共API中的類,即在JavadocGroovydoc中記錄的類。 (並非所有內部類都在包名中包含internal)。

+0

感謝Peter。僅供參考。我進入了'JavaExec'(點1),因爲它很容易實現並滿足我的需求。目前只有一個主要方法必須被調用。 –