在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.
有办法做我想做的事吗?
答案 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,你必须使所有插件可用作可通过依赖系统解析的工件)