2014-01-19 37 views
2

我在SBT中想要的是在Play 2.2.1控制檯中爲foo a b c輸入任務,調用通過a b c作爲參數列表的Java(靜態)方法被執行。在SBT/Play中運行內部構建定義的Java方法

PlayConsole:foo a b c ===should call===> Foo.bar(a,b,c)

我有以下游戲目錄結構和文件(Java項目):

-myplayapp 
    -app 
    -controllers 
    -views 
    -myfolder 
     Foo.java 
    -project 
    ... 
    build.scala 
    ... 

myfolder.Foo

package myfolder; 

public class Foo { 
    public static void bar(String... args) { 
     for(String s : args) 
      System.out.println(s); 
    } 
} 

項目/ build.scala

import sbt._ 
import Keys._ 
import play.Project._ 
import sbt.complete.Parsers._ 

object ApplicationBuild extends Build { 

    val appName   = "myplayapp" 
    val appVersion  = "1.0-SNAPSHOT" 

    val appDependencies = Seq() 

    val foo = inputKey[Unit]("Foo you.") 

    val fooSettings = foo := {  
     val args: Seq[String] = spaceDelimited("<arg>").parsed   
     // Foo.bar(args) 
    } 

    val main = play.Project(appName, appVersion, appDependencies).settings(
     fooSettings  
    ) 
} 

我試過import myfolder.Foo._import myfolder.Foo.bar沒有成功。這兩種情況的錯誤是相同的:

not found: object myfolder. 

有沒有辦法做我想做的事?

+0

的問題不在於'static'。這工作正常:'import java.lang.String.format;格式(「a%s c」,「b」)' – senia

+0

爲什麼不在build.scala中創建一個scala方法? 'def foo(args:String *):Unit = args.foreach(println)'或者其他任何表達式。 –

+0

您可以使用安裝,清理編譯,測試等步驟,並插入此方法。 –

回答

2

由於您使用播放2.2.1自帶sbt 0.13 support我會用build.sbt代替。您應該可以輕鬆地將其遷移到您的ApplicationBuild,因爲更改是化妝品

與以下內容播放應用程序的項目目錄中創建build.sbt

import sbt.complete.Parsers._ 
import myfolder.Foo 

lazy val foo = inputKey[Unit]("Foo you.") 

foo := { 
    val args: Seq[String] = spaceDelimited("<arg>").parsed 
    Foo.bar(args: _*) 
} 

注意import的不需要新的線之間以及args需要擴大,以可變參數_*

project/src/main/java/myfolder中保存以下Foo.java文件。

project/src/main/java/myfolder/Foo。java的

package myfolder; 

public class Foo { 
    public static void bar(String... args) { 
     for(String s : args) 
      System.out.println(s); 
    } 
} 

請注意,因爲你需要使用Java類的構建定義(可以從SBT參數執行任務),它是SBT構建的一部分不是你的遊戲項目(因此它在project下 - 見sbt is recursive)。

當SBT殼的,磨合與任意數量的參數的輸入foo任務:

[sbt-0-13-1]> foo2 ala ma kota 
ala 
ma 
kota 
[success] Total time: 0 s, completed Jan 21, 2014 12:00:46 AM 
+0

我可以按照步驟在遊戲控制檯中運行該方法。我在'/ myplayapp/project'裏創建了一個'/ src/main/java/myfolder/Foo.java',它工作正常。我不知道這是否是我需要完成的最好的遊戲框架練習,但我現在堅持下去。謝謝Jacek。 – Danillo

+1

我對SBT沒有太多經驗,所以我不知道這是否是一種好的做法。我在這種情況下所說的是,無論有什麼其他選擇,如果它們是未知的,我們知道的是最好的一個。雖然我似乎無法想到更好的方法。 –

0

sbt實例的類路徑與您的項目不同。如果是這樣的話,如果你有一個編譯錯誤,例如因爲它會創建一個依賴項,編譯器必須首先編譯你的項目文件以便能夠編譯Build.scala文件,那麼就不可能在sbt中啓動你的項目。

爲了能夠在sbt中使用類,它們必須位於構建源中,即生存在project/目錄中的類。如果你把項目中的構建相關的Java源代碼放到項目中,那麼sbt會在運行之前編譯這些源代碼,你將能夠從sbt構建文件中訪問這些類。

(這可以定義特定的項目SBT相比,例如Maven插件,你必須讓所有的插件可以作爲文物,可以通過依賴系統解決)