当前位置: 首页 > 知识库问答 >
问题:

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

孙思源
2023-03-14

我试图在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 */)        
}

在@口渴行通知后更新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的懒val必须有. set(通用设置:_*),如果没有,它会尝试使用版本2.10

更新2,现在我知道我必须更改为project main并执行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

我学到了很多,再次感谢


共有2个答案

卫弘义
2023-03-14

似乎主体可能是文件名,但不是类名。更多信息,请张贴校长的内容。Scala类和文件名应该以后者开头
还要检查主类是否是对象。

司寇书
2023-03-14

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

为main项目设置main Class,并使用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")
  )
 类似资料:
  • 我面临着以下问题。我有两个Gradle项目(ProjectA和ProjectB)在同一个层次结构上,没有任何根项目。由于ProjectA依赖于ProjectB,我尝试将其建模如下: ProjectA的settings.gradle: ProjectA的build.gradle: 然而,当我在ProjectA上执行gradle build时,我得到了以下错误: 我必须在ProjectB中定义某种默认

  • 大家好,请指导如何在Xcode中解决:WebdriverAgent项目的问题。 在WebDriverAgent内部使用命令:./scripts/bootstrap.sh-d后,按照要求遵循所有先决条件 cd/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/open。复制WebdriverAgent文件夹cd

  • 问题内容: 我有一个Eclipse插件项目,它取决于我在Eclipse工作区中拥有的其他项目。在“ Java Build Path”->“ Projects”选项卡下添加项目依赖项,并在“ Order and Export”中选择项目后,我得到了java.lang.NoClassDefFoundError。 我假设其他项目未正确包含在插件中。有谁知道如何解决这一问题? 谢谢,詹姆斯 问题答案: E

  • 我有以下项目结构: 问题: 如何在项目2中执行类? 来自哪个项目? 如果我只想编译/打包 project2,我该怎么做?(如果我从项目2中执行,则找不到项目1)。我想在不安装项目1的情况下执行此操作。 当然,如果需要的话,项目的结构可以改变。 下面显示了pom.xml文件中的相关部分。父/砰.xml 父/项目1/pom.xml 父/项目2/pom.xml 父/项目3/pom.xml与项目2相似

  • 我有一个Advision类,它使用了代理jar中的另一个类,但这个类依赖于代理jar中不存在的一个类。代理jar中不存在的这个类存在于应用程序类加载器上的另一个jar中。代理jar位于系统类加载器上。所以我没有遇到ClassDefounderRor。我已经尝试使用Transformer.forAdvise,这是在另一篇文章中建议的,但这只适用于Advise类。

  • 我已经在NetBeans8.1中创建了5个不同的Java SE项目。我想创建一个新的项目,该项目带有一个介绍窗口,该窗口带有链接/打开链接到该按钮的项目的按钮,并从该窗口创建一个软件。 我已经在主项目->Properties->Library->Compile->Add Project中添加了依赖项(其他项目的jar文件)。 当我在netbeans中运行它们时,运行窗口打开了,但是当我从主项目中调