我正在努力解决相当简单的问题,但无法找到解决方案。 关键是 - 最近我开始学习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上。为什么?我该如何解决这个问题?
答案 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插件,等等。