2014-01-19 1 views
2

Что я хочу в SBT - это задача ввода, которая для foo a b c в консоли Play 2.2.1 вызовет метод Java (статический), передающий a b c в виде списка аргументов выполняется.Запуск метода Java внутри определения сборки в SBT/Play

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; format ("a% s c", "b") ' – senia

+0

Почему бы вам не сделать scala-метод в build.scala? 'def foo (args: String *): Unit = args.foreach (println)' или что-то или любое выражение в этом отношении. –

+0

Вы можете использовать шаги Setup, Cleanup на Compile, Test и т. Д. И подключить этот метод. –

ответ

2

Поскольку вы используете Play 2.2.1, который поставляется с sbt 0.13 support Вместо этого я буду использовать build.sbt. Вы должны с легкостью перенести его на ApplicationBuild, так как изменения скорее косметический.

Создать build.sbt в каталоге проекта приложения Play со следующим содержанием:

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 «s не нужна новая линия в-между, а также args потребности быть расширена varargs с _*.

Сохраните следующие Foo.java файл в project/src/main/java/myfolder.

проект/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 командного процессора запустите 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

Мне удалось запустить метод внутри игровой консоли после ваших шагов. Я просто создал '/ src/main/java/myfolder/Foo.java' внутри'/myplayapp/project', и он сработал. Я не знаю, является ли это лучшей практикой в ​​игровой практике для того, что мне нужно было выполнить, но сейчас я буду придерживаться ее. Спасибо Яцек. – Danillo

+1

У меня нет большого опыта работы с SBT, поэтому я не знаю, хорошая практика или нет. То, что я говорю в таких ситуациях, заключается в том, что независимо от каких-либо других вариантов, если они неизвестны, тот, который мы знаем, является лучшим. Хотя, похоже, я не думаю о лучшем подходе. –

0

Путь к классам экземпляра sbt - это не тот же путь к классу, что и ваш проект. Если бы это было тогда, было бы невозможно запустить проект в sbt, если бы у вас была ошибка компиляции, например, поскольку она создавала бы зависимость, и компилятор должен был сначала скомпилировать ваш файл проекта, чтобы скомпилировать файл Build.scala ,

Чтобы использовать классы в sbt, они должны были быть среди источников сборки, которые являются классами, которые находятся в каталоге project/. Если вы поместите связанные с построением java-источники в проект /, то sbt скомпилирует их перед запуском, и вы сможете получить доступ к этим классам из файла сборки sbt.

(Это позволяет определить модули, специфичные для проекта в SBT по сравнению, например, мавенно, где вы должны сделать все плагины доступны как артефакты, которые могут быть решены с помощью системы зависимостей)

Смежные вопросы