gradle 使用Slf4j和log4j2不工作,抛出ClassNotFoundException:org.slf4j.LoggerFactory

cvxl0en2  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(174)

这是一个非Spring应用程序。这是一个简单的java应用程序,有一个main。我使用Lombok@Slf4j和log4j2.xml配置文件。Gradle构建文件包含以下内容:

dependencies {
    ...
    implementation 'org.slf4j:slf4j-api:2.0.7'
    implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0'
    ...
}
configurations {
    testImplementation.extendsFrom compileOnly
    // excludes transitive dependencies
    implementation.transitive = false
}
jar {
    dependsOn check
    duplicatesStrategy = DuplicatesStrategy.FAIL

    configurations.implementation.setCanBeResolved(true)

    into('META-INF/lib') {
        from (configurations.implementation)
    }

    manifest {
        attributes("Spring-Context": "*;publish-context:=false")
        attributes(
            'Class-Path': configurations.runtimeClasspath.files.collect { it.getName() }.join(' '),
            'Main-Class': 'com.example.Application'
        )
    }
}

日志在IntelliJ中运行时工作正常。作为可执行jar文件运行:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at dia.nmec.twm.s3_client_plugin.S3ClientPlugin.<clinit>(S3ClientPlugin.java:10)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 1 more

建议?
TIA,Eric

nhaq1z21

nhaq1z211#

因此,要包含的库是以下...

implementation 'org.slf4j:slf4j-api:2.0.7'
implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0'

我的问题是build. gradle。例如,将所有必要的jar文件放在META-INF/lib中,并不会将jar文件添加到类路径中。事实上,就我所知,将jar文件复制到META-INF/lib对于可执行的jar文件来说是非常无用的。
在build.gradle的'jar'部分中的以下行将获取jar文件并将其分解到根目录,然后将所有内容都震动起来(称为'fat'或'uber' jar文件)。

from {
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}

这为我解决了一切。
我所希望的是能够将所有jar文件添加到META-INF/lib中(在jar任务中,删除上面的'from'任务)...

into('META-INF/lib') {
    from(configurations.runtimeClasspath)
}

然后将“Class-Path”添加到MANIFEST中,如下所示...

'Class-Path': configurations.runtimeClasspath.files.collect { it.getName() }.join(' ')

这样META-INF/lib中的所有jar文件都在类路径上并且可以被找到。
如果有人有建议,我很想听听这是否可行。

相关问题