使用Gradle构建的应用程序从IDE成功启动,但不是从控制台启动

时间:2017-01-19 22:24:35

标签: java intellij-idea gradle console

我正在努力解决相当简单的问题,但无法找到解决方案。 关键是 - 最近我开始学习Gradle并决定用这个构建工具创建我的第一个Intellij项目。我使用build.gradle中定义的外部库:

group 'ant.rozanski'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.fasterxml.jackson.core:jackson-databind:2.2.3'
        classpath 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.3.0'
    }
}
dependencies {
    testCompile 'org.junit.jupiter:junit-jupiter-api:5.0.0-M3'
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.3.0'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.2.3'

    compile 'org.apache.commons:commons-lang3:3.4'
}

项目从Intellij'Run'命令开始就好了。但是,不幸的是,当我尝试从控制台运行它时,我收到了这个异常:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonFactory
    at model.AALJourney.setParams(AALJourney.java:40)
    at model.AALJourney.doJob(AALJourney.java:24)
    at Start.main(Start.java:11)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 3 more

看起来gradle不会将这些外部库放在classpath上。为什么?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

假设您使用java -jar ..之类的东西从控制台运行您的类或jar(您没有说明如何从控制台运行它,或者您正在运行的内容;您应该在问题中澄清这一点如果没有),这似乎是正确的。 IDE中的Run目标知道如何为应用程序设置类路径。

可能有一个IDE目标来生成一个包含所有外部依赖项的引用的可运行jar。但是如果你有一个裸jar,你将不得不使用自定义类路径调用JVM。或者你可以推出一个包含第三方库的可运行的罐子。

Gradle缓存依赖项jar,因此您可以使用这些路径来构建类路径。

答案 1 :(得分:1)

您应该使用Gradle的application插件。它提供了一个run任务,它正确地设置了类路径,还提供了使用Windows构建可分发包的任务,以及根据需要设置类路径的* nix启动脚本。

除此之外,如果您显示的是完整的build.gradle,那么整个buildscript块都是无意义的。您将Jackson添加到构建脚本的类路径中,但您不能在任何地方使用它。在buildscript块中,您可以在构建脚本中添加所需的依赖项,例如一些Gradle插件,等等。