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

标签 java scala playframework-2.0 sbt

我在 SBT 中想要的是有一个输入任务,对于 Play 2.2.1 控制台中的 foo a b c 来说,调用传递 a b c 的 Java(静态)方法作为执行参数列表。

PlayConsole:foo a b c ===应该调用===> Foo.bar(a,b,c)

我有以下 Play 目录结构和文件(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);
    }
}

project/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.

有办法做我想做的事吗?

最佳答案

由于您使用附带 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 需要使用 _* 扩展为可变参数。

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

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 构建的一部分,而不是您的 Play 项目(因此它位于 project 下) - 请参阅 sbt is recursive )。

当 SBT shell 启动时,使用任意数量的参数运行 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

关于java - 在 SBT/Play 中的构建定义内运行 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21221114/

相关文章:

scala - 为什么这个 LR 代码在 spark 上运行太慢?

Scala Play 2.4 View 渲染与应用

java - 没有数据库的简单 Jasper 报告

java - JTable 中未选中的复选框会给出 NullPointerException

c - 使用 union 处理错误

Junit中eclipse中的Java play框架错误

java - 删除表单中断 Play Framework 中的输入(2.3)

java - 比较行不起作用,为什么?我该如何解决?

java - java有频率表吗?

scala - 如何使用 `asRight` 创建带有猫的 Either 实例