使用 Log4J 时出现 NoClassDefFoundError

问题描述 投票:0回答:1

我写了一个小脚本来试试Log4J,但是总是报错:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
        at de.redstonepfalz.cachebuilder.CacheBuilder.<clinit>(CacheBuilder.java:7)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 1 more

在 build.gradle 文件中,我输入了最新版本的 log4j-core 和 log4j-api,并且还安装了库。 IntelliJ 没有向我显示任何错误。 编译时也没有出现错误消息。

有人知道我做错了什么吗?

这是 Java 代码:

package de.redstonepfalz.cachebuilder;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class CacheBuilder {
    private static final Logger logger = LogManager.getLogger(CacheBuilder.class);

    public static void main(String[] args) {
        logger.trace("Skript wird gestartet");
        logger.error("Ein Fehler ist aufgetreten");
        logger.fatal("Fatal");
        logger.info("Ein Infofall ist aufgetreten");
        logger.warn("Ein Warnung ist aufgetreten");
        logger.debug("Debug messsage");
        logger.trace("Skript wird beendet");
        System.out.println("Hello world!");
    }
}

build.gradle:https://pastebin.com/JftEB0QD

java gradle logging log4j build.gradle
1个回答
0
投票

迷你项目

项目结构

CacheBuilder
├── build.gradle
├── settings.gradle
└── src
    └── main
        ├── java
        │   └── de
        │       └── redstonepfalz
        │           └── cachebuilder
        │               └── CacheBuilder.java
        └── resources
            └── log4j2.xml

CacheBuilder.java 和你的一样。

settings.gradle

rootProject.name = 'CacheBuilder'

build.gradle

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {

    // This dependency is used by the application.
    implementation 'com.google.guava:guava:31.1-jre'

    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'

    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'

}

application {
    // Define the main class for the application.
    mainClass = 'de.redstonepfalz.cachebuilder.CacheBuilder'
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="5">
    <properties>
        <property name="LOG_DIR">logs</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_ERR">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" />
        </Console>
        <File name="file" fileName="${LOG_DIR}/demoapp.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
        </File>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="file" />
        </Root>
    </Loggers>
</Configuration>

建造

运行命令:

gradle clean build

结果:

CacheBuilder
├── build
...
│   ├── distributions
│   │   ├── CacheBuilder.tar
│   │   └── CacheBuilder.zip
...

解压缩 build/distributions/CacheBuilder.tar 或 zip(如果是 windows)

build/distributions
├── CacheBuilder
│   ├── bin
│   │   ├── CacheBuilder
│   │   └── CacheBuilder.bat
│   └── lib
│       ├── CacheBuilder.jar
│       ├── checker-qual-3.12.0.jar
│       ├── error_prone_annotations-2.11.0.jar
│       ├── failureaccess-1.0.1.jar
│       ├── guava-31.1-jre.jar
│       ├── j2objc-annotations-1.3.jar
│       ├── jsr305-3.0.2.jar
│       ├── listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
│       ├── log4j-api-2.20.0.jar
│       └── log4j-core-2.20.0.jar
...

运行它

Linux

cd build/distributions/CacheBuilder/bin
./CacheBuilder

视窗

cd build\distributions\CacheBuilder\bin
CacheBuilder.bat

然后您可以在控制台上找到输出消息。

并找到一个

logs
目录创建。

CacheBuilder
├── build
...
│   ├── distributions
│   │   ├── CacheBuilder
│   │   │   ├── bin
│   │   │   │   ├── CacheBuilder
│   │   │   │   ├── CacheBuilder.bat
│   │   │   │   └── logs
│   │   │   │       └── demoapp.log

因为你使用插件id 'application',

它将为您的应用程序名称

CacheBuilder.bat
CacheBuilder.bat
创建包装器命令,并构建分发文件:
CacheBuilder.tar
CacheBuilder.zip
,在目录
distributions

© www.soinside.com 2019 - 2024. All rights reserved.