як встановити основний клас у проекті SBT 0,13


77

Не могли б ви, хлопці, пояснити мені, як встановити основний клас у проекті SBT? Я намагаюся використовувати версію 0.13.

Моя структура каталогів дуже проста (на відміну від документації SBT). У кореневій папці у мене є build.sbtтакий вміст

name := "sbt_test"

version := "1.0"

scalaVersion := "2.10.1-local"

autoScalaLibrary := false

scalaHome := Some(file("/Program Files (x86)/scala/"))

mainClass := Some("Hi")

libraryDependencies ++= Seq(
    "org.scalatest" % "scalatest_2.10" % "2.0.M5b" % "test"
)

EclipseKeys.withSource := true

І у мене є підпапка projectз одним файлом, Hi.scalaякий містить наступний код

object Hi {
  def main(args: Array[String]) = println("Hi!")
}

Я можу скомпілювати це за допомогою виклику, sbt compileале sbt runповертається

The system cannot find the file C:\work\externals\sbt\bin\sbtconfig.txt.
[info] Loading project definition from C:\work\test_projects\sbt_test\project
[info] Set current project to sbt_test (in build file:/C:/work/test_projects/sbt_test/)
java.lang.RuntimeException: No main class detected.
        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) No main class detected.
[error] Total time: 0 s, completed Apr 8, 2013 6:14:41 PM

Ваш досвід не є типовим. Чи замислювались ви, чи нестандартна збірка Scala може бути частиною проблеми?
Randall Schulz,

2
@RandallSchulz Nope. Тому що я вмію складати. Також заради експерименту я змінив налаштування, щоб дозволити SBT отримати компілятор Scala та перейменований ім'я класу в mainClass. sbt runвсе одно працювало :) Що вказує на те, що SBT просто ігнорує налаштування.
експерт

4
@HeikoSeeberger Я взяв усе найновіше на веб-сайті SBT. Структура каталогів стандартного проекту Play Framework відрізняється. Я хотів змусити Play використовувати останню версію scala замість того, щоб примушувати до 2.9.2. Не могли б ви проголосувати запитання?
експерт

1
Вам не вистачає деяких важливих моментів: По-перше, scala-sbt.org показує 0.12.3 як останню (випущену) версію. По-друге, версія Scala, яку використовує sbt внутрішньо, не пов’язана з версією Scala для вашого проекту, за винятком того, що вона використовується за замовчуванням, якщо ви не встановите іншу scalaVersionу своїй збірці. По-третє, Play, як і багато інших бібліотек Scala, компілюється щодо певної версії Scala, і ви повинні використовувати це (або оновлення, сумісне з бінарними файлами). По-четверте, я тут дію виключно від свого імені.
Heiko Seeberger

1
Питання @HeikoSeeberger, описані у цьому питанні, не стосуються альфа-версії. Але приємно спробувати.
експерт

Відповіді:


50

Вам потрібно помістити джерело вашого додатка src/main/scala/, project/є для коду визначення збірки.


Не допомогло. Більше того, я зараз навіть не можу скомпілювати. Отримайте виняток Java pastebin.com/MUbRQfvx
експерт

6
інша проблема, вилучити autoScalaLibrary := false& scalaHome := Some(file("/Program Files (x86)/scala/"))лінії та встановитиscalaVersion := "2.10.1"
Джед Уеслі-Сміт

Ти маєш рацію. Виняток спричинив autoScalaLibrary. Дякую!
експерт

24

Спробуйте використовувати об'єкт і розширити його з програми, а не використовувати клас

object Main extends App {
  println("Hello from main scala object")
}

16

Ось як вказати основний клас

mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")


4
Насправді mainClass := Some("Hi")це також було б добре, тому що sbt повернеться до більш загальних областей застосування, якщо немає значення для ключа в більш конкретному обсязі.
Heiko Seeberger

1
@HeikoSeeberger mainClass := Some("Hi")не працює в 0.12.3, якщо мій проект має два класи з mainметодом. SBT просить мене вибрати клас.
експерт

4
Якщо ви використовуєте Scala, він також очікує, Mainщо extends Appце буде object. Я був справді німий, і це мене трохи повісило.
BeepDog

2
У моєму проекті також є кілька основних класів, що запускаються додатками, але я неодноразово запускаю лише один протягом тривалих періодів часу, попередній вибір дуже корисний. Я помістив це у свій файл buid.sbt: mainClass у (Скомпілювати, запустити): = Деякі ("my.home.z033.rngtest.RngTest1") ..і він спрацював чудово. Укорочений варіант: mainClass: = Деякі ("my.home.z033.rngtest.RngTest1") у мене не працювали (sbt 0.13.1)
Еспіноса

6

Для користувацьких модулів у SBT (0,13) просто введіть на консолі SBT:

 project moduleX
 [info] Set current project to moduleX (in build file:/path/to/Projects/)
 >   run
 [info] Running main 

переключити область на moduleX, як визначено в Built.scala. Усі основні класи, що знаходяться в цій області, будуть виявлені автоматично. В іншому випадку ви отримуєте ту саму помилку, жодного основного класу не виявлено. За бога, SBT не говорить вам, що область за замовчуванням не встановлена. Це не має нічого спільного із вихідними папками за замовчуванням та не за замовчуванням, а лише у тому, що SBT нічого не повідомляє, що не знає, який модуль використовувати за замовчуванням.

Велика підказка для typesafe : БУДЬ ЛАСКА, додайте вихідні дані за замовчуванням, наприклад:

[info] Project module is not set. Please use ''project moduleX''  set scope 
or set in Built file (LinkToDocu)  

в кінці SBT починайте знижувати рівень розчарувань під час використання SBT на багатомодульних проектах .....


3

Якщо у вашому проекті є кілька основних методів, ви можете додати наступний рядок до свого файлу build.sbt:

val projectMainClass = "com.saeed.ApplicationMain"

mainClass in (Compile, run) := Some(projectMainClass)

Якщо ви хочете вказати клас, який буде доданий до маніфесту, коли ваша програма буде упакована як файл JAR, додайте цей рядок до свого файлу build.sbt:

mainClass in (Compile, packageBin) := Some(projectMainClass)

Ви також можете вказати основний клас, використовуючи команду run-main у sbt та активаторі для запуску:

sbt "run-main com.saeed.ApplicationMain"

або

activator "run-main com.saeed.ApplicationMain"

3

У мене була та сама проблема: був режим, дотримуючись підручника на http://www.scala-sbt.org/0.13/docs/Hello.html , і, на мій погляд, sbtвзаємодія інструмента збірки та повідомлення про помилки можуть бути цілком введення в оману новачка.

Виявилося, через кілька годин дряпання голови cd helloщоразу я пропускав критичну лінію в прикладі. :-(


6
Конні, ти можеш просто запитати мене :) Я сиджу перед тобою LOL
Сем Упра

1
@PongpiraUpra Навіть я теж :)
Vishal John

1
@VishalJohn hahaha
Сем Упра

1

Є 4 варіанти

  1. у вас є 1 основний клас

    • sbt run і sbt знайде для вас головне
  2. у вас є 2 або більше основних класів

    • sbt run і sbt запропонує вибрати, яку ви хочете запустити.

Multiple main classes detected, select one to run:
[1] a.b.DummyMain1
[2] a.b.DummyMain2
Enter number:

  1. Ви хочете встановити основний клас вручну.

    mainClass in run := Some("a.b.DummyMain1")
    
  2. Ви можете запустити основний клас як параметр

    sbt runMain a.b.DummyMain1
    

1

Якщо клас Main знаходиться в іншому проекті, тоді, встановивши наведену нижче команду in, build.sbtбуде працювати:

addCommandAlias("run", "; project_folder/run")

0

У мене була та сама проблема. Вирішено після додавання PlayMinimalJavaплагіна в build.sbt.

Не впевнений, як це виправлено, якщо хтось може підкреслити, як PlayMinimalJavaце вирішується, було б чудово.

enablePlugins(PlayMinimalJava)

Мій build.sbtвигляд такий

organization := "org"
version := "1.0-SNAPSHOT"
scalaVersion := "2.13.1"
libraryDependencies += guice
enablePlugins(PlayMinimalJava)

Журнал

C:\Users\KulwantSingh\repository\pdfdemo>sbt run
Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading settings for project pdfdemo-build from plugins.sbt ...
[info] Loading project definition from C:\Users\KulwantSingh\repository\pdfdemo\project
[info] Loading settings for project pdfdemo from build.sbt ...
[info] Set current project to pdfdemo (in build file:/C:/Users/KulwantSingh/repository/pdfdemo/)
[warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings.

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Enter to stop and go back to the console...)

[info] Compiling 6 Scala sources and 2 Java sources to C:\Users\KulwantSingh\repository\pdfdemo\target\scala-2.13\classes ...
[info] p.a.h.EnabledFilters - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):

    play.filters.csrf.CSRFFilter
    play.filters.headers.SecurityHeadersFilter
    play.filters.hosts.AllowedHostsFilter

[info] play.api.Play - Application started (Dev) (no global state)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.