当前位置: 首页 > 知识库问答 >
问题:

Java&Gradle&log4j noclassdeffounderror:org/apache/logging/log4j/logmanager

钦侯林
2023-03-14

https://logging.apache.org/log4j/2.x/maven-artifacts.html

dependencies {
  compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.1'
  compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.1'
}

我将它粘贴到我的build.gradle文件中,并编写了运行代码的示例代码。

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

public class Program {
    private static final Logger logger = LogManager.getLogger("HelloWorld");

    public static void main(String[] args) {
        logger.error("Just a test error entry");
    }
}

除此之外,我还添加了manifest以便从控制台运行代码。

jar {
    manifest {
        attributes "Main-Class": "Program"
    }
}
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
        at Program.<clinit>(Program.java:5)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
        ... 1 more
jar {
    manifest {
        attributes "Main-Class": "Program"
    }

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

最重要的是,有一点需要指出,虽然它不能与java-jar<.jar>一起工作,但出于某种原因,它仍然可以在Intellij IDEA中工作。有人能给我解释一下为什么吗?

共有1个答案

乜承嗣
2023-03-14

您遇到的问题是由启动应用程序时应用程序的类路径中的问题引起的(例如,什么是类路径以及如何设置它?)。

Gradle有许多选项可以帮助您正确设置类路径。因为您没有提到任何Gradle版本,所以我将在示例中使用7.1版本。假设您在名为appname的项目中有这个build.gradle文件:

plugins {
  id 'application'
}

dependencies {
  implementation group: 'org.apache.logging.log4j', name: 'log4j-api',  version: '2.14.1'
  runtimeOnly    group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.1'
}

application {
  mainClass = 'com.example.App'
}

(log4j-core不是编译代码所必需的,因此它位于runtimeonly依赖项配置中,即依赖项配置)

java -cp log4j-api-2.14.1.jar:log4j-core-2.14.1.jar:appName.jar com.example.App

因此,applicationGradle插件生成一个shell和一个批处理脚本来帮助您:执行installdist任务,并查看build/install/appname(或者您可以使用distzipdisttar任务来获得该文件夹的压缩版本)。设置正确的命令简化为调用:

bin/appName

您还可以对JARs清单文件中所需的依赖项进行硬编码。在Gradle中,您可以使用:

jar {
  manifest {
    attributes(
      'Main-Class': 'com.example.App',
      'Class-Path': configurations.runtimeClasspath.collect { it.name }.join(' ')
    )
  }
}

获取包含启动应用程序所需的所有信息的清单文件:

Main-Class: pl.copernik.gradle.App
Class-Path: log4j-core-2.14.1.jar log4j-api-2.14.1.jar
java -jar appName.jar

如果希望在单个JAR中拥有所有依赖项,可以使用Spring Boot Gradle插件而不是application插件:

plugins {
  id 'java'
  id 'org.springframework.boot' version '2.5.3'
}

bootjar任务将生成一个appname.jar,其结构类似于distzip文件生成的appname.zip文件。但是shell/batch脚本被Java代码替换,所以您可以调用:

java -jar appName.jar

你在你的问题中做了什么:

jar {
    manifest {
        attributes "Main-Class": "com.example.App"
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
 类似资料:
  • 问题内容: 我想在我正在使用的Elasticsearch中执行单元测试, 我正在使用 并参考以下链接以寻求帮助 https://www.elastic.co/guide/en/elasticsearch/reference/1.6/using- elasticsearch-test-classes .html https://github.com/elastic/elasticsearch/blo

  • 我想在Elasticsearch中执行单元测试,因为我正在使用

  • 这是Spring应用程序中非常易于使用的Log4J功能。 下面的示例将指导您完成Log4J和Spring之间简单集成的简单步骤。 我们假设您的计算机上已经安装了log4J 。 如果你没有它,那么你可以从https://logging.apache.org/下载它,只需在任何文件夹中提取压缩文件。 我们将在项目中仅使用log4j-xyzjar 。 接下来,让我们使用一个可用的Eclipse IDE,

  • 我的build.gradle文件中有以下依赖项。 在运行我的单元测试时,将显示以下日志。 我使用的是Spring启动2.0.4。释放。我希望这只是某种版本不匹配的问题。任何见解都受到赞赏。

  • 问题内容: 我总是遇到以下错误。有人可以帮我吗? 当我编译以下代码时。我已经在网上搜索了,但没有找到解决方案。添加saveToCassandra时出现错误。 我的pom是以下内容。 问题答案: org.apache.spark.Logging在Spark版本1.5.2或更低版本中可用。它不在2.0.0中。请更改版本如下

  • 我试图用火花流在推特上找到流行的标签。 twitter4j-stream-4.0.4.jar Spark-Streaming-Twitter2.10-1.0.0.jar 在代码上,齐柏林飞船工作得很好 任何帮助都将不胜感激! 谢谢。