即将在具有依赖项的scala项目中加载主类

即将在具有依赖项的scala项目中加载主类,scala,sbt,Scala,Sbt,我试图在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_with

我试图在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)
这个项目的文件夹在根文件夹中有
build.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...")
    //val uri = CassandraConnectionUri("cassandra://localhost:9042/test")
    //val session = Helper.createSessionAndInitKeyspace(uri)

    //session.execute(/* Some CQL string */)        
}
在@QuirtyCrow advise之后更新1

我不明白sbt为什么要寻找common_2.10,因为在commonSettings中Scalaversation设置为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 -- Copyright 2002-2016, LAMP/EPFL
好的,现在我知道main的lazy val必须有.settings(commonSettings:*),如果没有,它将尝试使用版本2.10

更新2,现在我知道我必须切换到projectmain并执行run命令。谢谢你,干渴的克罗和纳比尔

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

我学到了很多,再次感谢

似乎
主体
可能是文件名,而不是类名。 请张贴
委托人的内容
,了解更多信息。 Scala类和文件名应以后者开头。

还要检查主类是否是
对象

似乎
主体
可能是文件名,而不是类名。 请张贴
委托人的内容
,了解更多信息。 Scala类和文件名应以后者开头。

还要检查您的主类是否是
对象

CassandraMain是否在主项目中,并且您正在尝试在根项目中运行它

为主项目设置mainClass,并使用
main/run
在那里运行它

lazy val main = project.in(file("main"))
  .dependsOn(common) // Should 'dependsOn' common if you wanna use common code in main
  .settings(
    mainClass := Some("common.utils.cassandra.CassandraMain")
  )

CassandraMain位于主项目中,您正在尝试在根项目中运行它

为主项目设置mainClass,并使用
main/run
在那里运行它

lazy val main = project.in(file("main"))
  .dependsOn(common) // Should 'dependsOn' common if you wanna use common code in main
  .settings(
    mainClass := Some("common.utils.cassandra.CassandraMain")
  )

谢谢Nabil的回复,我已经将principal.scala重命名为CassandraMain.scala并更改了build.sbt文件,错误仍然存在。谢谢@quirtycrow,我已经做了你告诉我的,我不得不修改lazy val main=project.in(file(“main”).dependsOn(common)。settings(commonSettings:*).settings(mainClass:=一些(工程班)为了使用正确版本的scala进行编译。它试图使用scala 2.10版本而不是commonSettings,返回一个未解决的依赖项错误,但错误java.lang.ClassNotFoundException:common.utils.cassandra.CassandraMain仍然存在。感谢Nabil的响应,我已经将principal.scala重命名为CassandraMain.scala和已更改的build.sbt文件,错误仍然存在。谢谢@口渴行,我已经按照你告诉我的做了,我必须修改lazy val main=project.in(file(“main”).dependsOn(common).settings(commonSettings:*).settings(mainClass:=Some(projectMainClass))为了使用正确版本的scala进行编译。它试图使用scala 2.10版本而不是commonSettings,返回了一个未解决的依赖项错误,但是错误java.lang.ClassNotFoundException:common.utils.cassandra.CassandraMain仍然存在。好的,现在我已经理解了您试图告诉我的内容。更改到主项目正在执行项目主运行和执行运行。好的,现在我已经理解了您试图告诉我的内容。更改为正在执行项目主运行和执行运行的主项目。