代码之家  ›  专栏  ›  技术社区  ›  aironman

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

  •  1
  • aironman  · 技术社区  · 9 年前

    我试图在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...")
        //val uri = CassandraConnectionUri("cassandra://localhost:9042/test")
        //val session = Helper.createSessionAndInitKeyspace(uri)
    
        //session.execute(/* Some CQL string */)        
    }
    

    在@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 -- Copyright 2002-2016, LAMP/EPFL
    

    好的,现在我知道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
    

    我学到了很多,再次感谢

    2 回复  |  直到 9 年前
        1
  •  3
  •   thirstycrow    9 年前

    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")
      )
    
        2
  •  2
  •   Nabil A.    9 年前

    看起来像是 principal 可能是文件名,但不是类名。 请张贴的内容 最重要的 了解更多信息。 Scala类和文件名应该以后一个高位开头。
    还要检查您的主类是否是 object .