【问题标题】:Gradle built jar does not find my main classGradle build jar 找不到我的主类
【发布时间】:2014-04-16 17:08:57
【问题描述】:

在工作中,我们在 Scalding 项目中使用 gradle,我正在尝试提出最简单的工作来摆脱堆栈。

我的班级看起来像:

package org.playground

import com.twitter.scalding._

class readCsv(args: Args) extends Job(args) {

    val csv:Csv = Csv(args("input"), ("firstName", "lastName"))
    println(csv)
}

并且生活在in playground/src/org/playground/readCsv.scala。我的构建脚本如下所示:

apply plugin: 'scala'

archivesBaseName = 'playground'

mainClassName = 'org.playground.readCsv'

repositories {
  mavenLocal()
  mavenCentral()
  maven{ 
        url 'http://conjars.org/repo/'
        artifactUrls  'http://clojars.org/repo/‎'
        artifactUrls  'http://maven.twttr.com/'
    }
}

dependencies {

    compile 'org.scala-lang:scala-compiler:2.9.2'
    compile 'org.scala-lang:scala-library:2.9.2'
    compile 'bixo:bixo-core:0.9.1'
    compile 'org.apache.hadoop:hadoop-core:1.2.1'
    compile 'com.twitter:scalding_2.9.2:0.8.1' 
    compile 'cascading:cascading-core:2.1.6'
    compile 'cascading:cascading-hadoop:2.1.6'
    testCompile 'org.testng:testng:6.8.7'
    testCompile 'org.scala-tools.testing:specs:1.6.2.2_1.5.0'
}

test {
    useTestNG()
}

jar {
  description = "Assembles a Hadoop-ready JAR file"
  manifest {
    attributes( "Main-Class": "org.playground.readCsv" )
  }
}

这编译并构建成功,但尝试运行 jar 会抛出此错误:

$ java -jar build/libs/playground.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/playground/readCsv
Caused by: java.lang.ClassNotFoundException: org.playground.readCsv
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

我有根据的猜测是,从 Job 扩展作业不符合某些约定,并且看起来不像有效的 Main-Class,但我不希望它抱怨找不到它。

另一种可能性是以java -jar jarname 运行它是不正确的,我只需要使用hadoop 或类似的东西来运行它。

无论如何,只是为了验证:我的设置有什么问题?

【问题讨论】:

    标签: gradle main scalding


    【解决方案1】:

    源文件的位置错误。默认情况下,它需要进入src/main/scala/org/playground/readCsv.scala。否则,它甚至不会被编译。

    【讨论】:

    • 我确实错过了那一点设置。
    • mmm... 现在似乎没有从环境中选择正确的路径:dpaste.de/yThN
    • 您需要将正确的类路径传递给java 命令(-cp ...)。至少,类路径需要包含 Scala 和 Scalding Jar(s)。 Gradle 的 application 插件会为您解决这个问题。 java 命令对SCALA_LIBRARY_PATH 一无所知。 (也许scala 命令可以,但是您仍然需要提供 Scalding Jar,可能还需要提供其他 Jar。)如果您想创建一个独立的可执行 Jar,请查看 gradle-one-jar 插件。
    • 这是 Hadoop 作业。所以它最终会变成一个胖罐子。我真的错过了那么多手册还是没有记录。我会调查那个 gradle-one-jar 的东西,谢谢。
    • 你不是在创建一个胖罐子。我已经在stackoverflow.com/questions/23018342/… 中回答了如何创建胖罐子。
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2020-10-03
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多