在SBT / Play中的构建定义中运行Java方法

时间:2014-01-19 18:53:15

标签: java scala playframework-2.0 sbt

在SBT中我想要的是输入任务,在Play 2.2.1控制台中为foo a b c调用Java(静态)方法,将a b c作为参数列表执行

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.

有办法做我想做的事吗?

2 个答案:

答案 0 :(得分:2)

由于您使用sbt 0.13 support附带的Play 2.2.1,我将改为使用build.sbt。您应该能够轻松地将其迁移到您的ApplicationBuild,因为更改是装饰

使用以下内容在Play应用程序的项目目录中创建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需要使用_*扩展为varargs。

将以下Foo.java文件保存在project/src/main/java/myfolder

<强>项目/ SRC /主/爪哇/ 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构建的一部分而不是您的Play项目(因此它位于{ {1}} - 请参阅sbt is recursive)。

当SBT shell启动时,使用任意数量的参数运行project输入任务:

foo

答案 1 :(得分:0)

sbt实例的类路径与您的项目的类路径不同。如果是,那么如果你有一个编译错误就不可能在sbt中启动你的项目,因为它会创建一个依赖项,编译器必须首先编译你的项目文件才能编译Build.scala文件。

为了能够在sbt中使用类,它们必须在构建源中,这是位于project/目录中的类。如果你把与构建相关的java源放在project /然后sbt将在运行之前编译它们,你将能够从sbt构建文件访问这些类。

(这使得在sbt中定义特定于项目的插件成为可能,例如maven,你必须使所有插件可用作可通过依赖系统解析的工件)