如何构建、编译和运行Scala项目?

如何构建、编译和运行Scala项目?,scala,sbt,Scala,Sbt,我想评估我在Github上发现的一个Scala项目,即 我找到了构建文件build.sbt。我设法通过自制安装了Scala和sbt,然后在项目根文件夹上运行命令sbt run。这样做会导致一个错误: java.lang.RuntimeException: No main class detected. at scala.sys.package$.error(package.scala:27) 现在,项目文件位于src/main/scala/io/mem0r1es/trank中,当我尝试

我想评估我在Github上发现的一个Scala项目,即

我找到了构建文件
build.sbt
。我设法通过自制安装了Scala和sbt,然后在项目根文件夹上运行命令
sbt run
。这样做会导致一个错误:

java.lang.RuntimeException: No main class detected.
    at scala.sys.package$.error(package.scala:27)
现在,项目文件位于
src/main/scala/io/mem0r1es/trank
中,当我尝试通过
scalac
编译或运行
sbt run
时,我得到了一系列关于对象不是基本包成员的错误,即
对象排名不是包io.mem0r1es.trank的成员


如果您能帮助我了解如何运行这个Scala项目,我将不胜感激。

TRank是一个SBT项目。您需要从此站点安装SBT

然后您可以这样构建它:

sbt clean compile package
这将在目标/文件夹中为您创建一个jar文件。一旦获得jar文件,就可以像使用Java jar文件一样使用它(除了必须使用scala自动包含scala库jar之外):


正如您已经注意到的,该项目由sbt管理

为了打包一个项目,即创建一个包含所有应该分发的项目工件的jar,您需要执行
package

> package
[info] Updating {file:/Users/jacek/sandbox/TRank/}trank...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 13 Scala sources to /Users/jacek/sandbox/TRank/target/scala-2.10/classes...
[warn] there were 1 deprecation warning(s); re-run with -deprecation for details
[warn] one warning found
[info] Packaging /Users/jacek/sandbox/TRank/target/scala-2.10/trank_2.10-1.0.jar ...
[info] Done packaging.
默认情况下,sbt管理
src/main/scala
目录下的源。您可以在那里找到要运行的
应用程序
对象

在sbt中,
run
搜索
src/main/scala
下的所有源以查找应用程序

> help run
Runs a main class, passing along arguments provided on the command line.
如果项目没有主类,则会打印错误:

> run
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 Sep 24, 2014 9:40:52 PM
这确实意味着该项目没有主类,但还有其他方法可以“证明”API正常工作——使用测试

执行
test
启动测试:

> test
[info] Compiling 5 Scala sources to /Users/jacek/sandbox/TRank/target/scala-2.10/test-classes...
[warn] there were 2 feature warning(s); re-run with -feature for details
[warn] one warning found
[info] ANC_DEPTHSpec:
[info] An ANC_DEPTH ranker
[info] - should rank types properly
[info] - should not fail when no types are provided
[info] ANCESTORSSpec:
[info] An ANCESTORS ranker
[info] - should rank types properly
[info] - should not fail when no types are provided
[info] DEPTHSpec:
[info] A DEPTH ranker
[info] - should rank types by maximum depth
[info] - should not fail when no types are provided
Loading classifier from edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz ... [info] PreProcessorSpec:
[info] A PreProcessor
[info] - should remove boilerplate from HTML content
[info] - should leave intact textual content
[info] - should not fail with empty content
done [2.8 sec].
[info] NERSpec:
[info] A NER
[info] - should extract entity labels
[info] - should not fail with content without Named Entities
[info] - should not fail with empty content
[info] Passed: Total 12, Failed 0, Errors 0, Passed 12
[success] Total time: 4 s, completed Sep 24, 2014 9:42:09 PM
因此,要了解该项目,您应该查看测试的来源(在
src/test/scala
下)以及可以使用
doc
任务生成的scaladoc:

> doc
[info] Main Scala API documentation to /Users/jacek/sandbox/TRank/target/scala-2.10/api...
model contains 20 documentable templates
[info] Main Scala API documentation successful.
[success] Total time: 1 s, completed Sep 24, 2014 9:43:22 PM
您还可以使用
console
task来输入Scala REPL并自己处理这些类型

> console
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

通过这些测试,scaladoc和Scala REPL,您应该已经准备好学习项目的API了。

谢谢您的回答,我已经设法看到了.jar文件,但是当我尝试运行它时,我在trank_2.10-1.0.jar中没有主清单属性。
您知道这是什么吗?这是项目配置。您可能希望浏览项目详细信息,找到使用
main
方法的类,然后像这样运行
scala-cp/path/to/trank_2.10-1.0.jar.com.example.SomeMainClass
我更新了答案。如果您使用的是
java-jar
,那么还需要包含Scala库jar文件。否则,只需使用
scala
而不是
java
。感谢您的帮助。显然,.scala文件中没有main方法。该项目应该作为一个API,所以我不知道这是否是一个原因。如果是,我将如何访问此API?我已经链接了Github项目,以防您想快速查看(我将非常感激)主repo中的自述文件,他们说“创建一个包含任何文本内容的TRanker对象就足够了”
class-TRanker(content:String)
这是否意味着我可以直接在REPL中执行此操作?是的,您可以,但不会得到”她坚持说“在源文件中。Scala REPL可以用于原型制作,但一旦关闭REPL会话,更改就消失了-您会发现
:save
也非常有用。感谢您的回复@Jacek。我之前放弃了集成那个API,因为我花了太多时间试图掌握它的窍门。但我很快就会需要它,我想知道接下来的几天您是否有时间在本地运行这段代码,并将其作为从外部应用程序调用的API(例如Node.js)进行聊天
> console
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala>