【问题标题】:IntelliJ can't find slf4j logger with gradleIntelliJ 找不到带有 gradle 的 slf4j 记录器
【发布时间】:2017-06-02 19:10:40
【问题描述】:

我有一个使用 gradle 的项目,我想使用 slf4j 提供的记录器。

在 Android Studio 中运行会产生以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at com.mypkg.Main.<clinit>(Main.java:9)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    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)
    ... 1 more

我的项目 build.gradle:

task wrapper(type: Wrapper) {
    gradleVersion = '3.5'
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.0'
    }
}

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'
apply plugin: 'application'

jar {
    manifest {
        attributes 'Main-Class': "Main"
    }
}

shadowJar {
    mergeServiceFiles('META-INF/spring.*')
}


mainClassName = 'com.mypkg.Main'

dependencies {
    compile 'com.squareup:otto:1.3.5'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.4.4'
    compile 'com.squareup.okhttp:okhttp:2.7.4'
    compile 'com.squareup.okhttp:okhttp-ws:2.7.4'
    compile 'com.parse.bolts:bolts-android:1.2.1'
    compile 'org.json:json:20140107'
    compile 'org.bouncycastle:bcprov-jdk15on:1.52'
    compile 'commons-codec:commons-codec:1.10'
    compile 'org.scream3r:jssc:2.8.0'

    compile 'ch.qos.logback:logback-classic:1.1.3'
    compile 'ch.qos.logback:logback-core:1.1.3'

    compile 'org.json:json:20140107'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.0.1'

    compile group: 'org.springframework.shell', name: 'spring-shell', version: '1.2.0.RELEASE'
    compile group: 'org.springframework', name: 'spring-context-support', version: '4.2.4.RELEASE'
    compile group: 'org.springframework', name: 'spring-core', version: '4.2.4.RELEASE'
    compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'


}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"

如果我使用 gradle 构建这个项目,shadow 插件会生成一个胖 jar,它可以很好地从控制台运行,它包含记录器,但是从 IDE 中我很难找到 LoggerFactory。我在这里读到我应该将记录器添加到类路径中,但由于我没有明确包含一个 jar,而不是将其标记为依赖项,所以我不确定这怎么可能。

请指教。 干杯!

【问题讨论】:

  • script apply plugin: 'idea' alt+f12 并运行 gradle idea 这将重新生成 .iml 文件和类路径。或者尝试安装最新版本的 IntelliJ,其中 gradle 集成更好

标签: java android-studio slf4j


【解决方案1】:

类路径不同步,这里的选项很少

  • 在 IntelliJ 中刷新项目(旧版本的 IntelliJ 不适合 gradle 集成)
  • apply plugin: 'idea' 添加到您的build.gradle 中,然后运行gradle idea 以在您的项目中重新生成.iml .ipr .iws 文件并从gradle 中获取依赖项。(不理想! see why)
  • 下载最新版本的 IntelliJ 并重做选项 1

编辑:感谢@CrazyCoder 的提示。

【讨论】:

  • 我接受了这个答案,但我对此有点偏见,因为它不是确切的答案,但它引导了我。首先,我错误地将问题标记为 intellij-idea,尽管在问题中我告诉我使用的是 android studio。你提到了刷新,但我有最新版本的 android studio,所以我想在他们的网站上爬来爬去,然后我尝试了一下想法,在没有任何更改的情况下运行我的项目没有问题。干杯:)
  • 不要使用gradle ideasee here why
  • 嗨。 “刷新 intelliJ 中的项目” .. 是什么意思.. ?我已经单击并转到菜单项,但找不到这个魔法。我知道这可能很愚蠢,但我被困住了。
  • @granadaCoder 有什么问题?刷新意味着等待几秒钟或按 F5
  • @granadaCoder 我相信右侧 gradle 面板中最左边的图标描绘了两个圆形箭头。在撰写本文时,它被标记为“重新加载所有 Gradle 项目”。
猜你喜欢
  • 2012-10-08
  • 2018-09-07
  • 2017-10-22
  • 2021-10-27
  • 2021-04-30
  • 2021-12-18
  • 2016-05-02
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多