我试图在scala中使用一个主对象,但SBT返回以下消息:
> package
[info] Packaging /Users/aironman/scala_cassandra_project_without_play/target/scala-2.10/my-project_2.10-0.1-SNAPSHOT.jar ...
[info] Done packaging.
[info] Packaging /Users/aironman/scala_cassandra_project_without_play/common/target/scala-2.11/common_2.11-0.1.jar ...
[info] Done packaging.
[info] Packaging /Users/aironman/scala_cassandra_project_without_play/main/target/scala-2.11/main_2.11-0.1.jar ...
[info] Done packaging.
[success] Total time: 0 s, completed 11-mar-2016 11:25:16
> run
[info] Running common.utils.cassandra.CassandraMain
[error] (run-main-1) java.lang.ClassNotFoundException: common.utils.cassandra.CassandraMain
java.lang.ClassNotFoundException: common.utils.cassandra.CassandraMain
at java.lang.ClassLoader.findClass(ClassLoader.java:530)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[trace] Stack trace suppressed: run last scala_cassandra_project_without_play/compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last scala_cassandra_project_without_play/compile:run for the full output.
[error] (scala_cassandra_project_without_play/compile:run) Nonzero exit code: 1
[error] Total time: 0 s, completed 11-mar-2016 11:25:18
>
正如你在我的
build.sbt
文件,我想使用一个相互尊重的多依赖设置。
name := "My Project"
val commonSettings = Seq(
organization := "net.example",
version := "0.1",
scalaVersion := "2.11.4",
scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")
)
lazy val testDependencies = Seq (
"org.scalatest" %% "scalatest" % "2.2.0" % "test"
)
lazy val cassandraDependencies = Seq (
"com.datastax.cassandra" % "cassandra-driver-core" % "2.1.2",
"com.chrisomeara" % "pillar_2.11" % "2.0.1"
)
lazy val common = project.in(file("common"))
.settings(commonSettings:_*)
.settings(libraryDependencies ++= (testDependencies ++ cassandraDependencies))
val projectMainClass = "common.utils.cassandra.CassandraMain"
lazy val main = project.in(file("main"))
.dependsOn(common)
.settings(commonSettings:_*)
.settings(
mainClass := Some(projectMainClass)
)
mainClass in (Compile, run) := Some(projectMainClass)
此项目的文件夹具有
构建.sbt
根文件夹中的文件和另外两个文件夹,
common
和
main
具有相同的结构,我的意思是,
aironman$:scala_cassandra_project_without_play ls common/src/main/scala/common/utils/cassandra/
CassandraConnectionUri.scala Pillar.scala
Helper.scala
aironman$:scala_cassandra_project_without_play ls main/src/main/scala/common/utils/cassandra/
CassandraMain.scala
主卡桑德拉。scala代码太简单了,只有包和主函数:
package common.utils.cassandra
import common.utils.cassandra._
object CassandraMain extends App{
println("Trying to connect to Cassandra server...")
}
在@thirstycrow建议后更新1
我不明白为什么sbt试图寻找common_2.10,因为在commonSettings中scalaVersion被设置为2.11.4,正如您所看到的,我的scala设置是:
MacBook-Pro-Retina-de-Alonso:~ aironman$ sbt sbtVersion
[info] Set current project to aironman (in build file:/Users/aironman/)
[info] 0.13.11
MacBook-Pro-Retina-de-Alonso:~ aironman$ scala -version
Scala code runner version 2.11.8
好的,现在我知道main的懒惰值必须有.settings(commonSettings:_*),如果没有,它会尝试使用2.10版本
更新2,现在我知道我必须更改为项目main并执行run命令。谢谢你@thirstycrow和@nabil。
MacBook-Pro-Retina-de-Alonso:scala_cassandra_project_without_play aironman$ sbt
[info] Set current project to My Project (in build file:/Users/aironman/scala_cassandra_project_without_play/)
> project main
[info] Set current project to main (in build file:/Users/aironman/scala_cassandra_project_without_play/)
> run
[info] Running common.utils.cassandra.CassandraMain
**Trying to connect to Cassandra server...**
[success] Total time: 1 s, completed 11-mar-2016 11:50:41
我学到了很多,再次感谢