【问题标题】:Why is it that only this Java import statement for Log4j works, but not the other one?为什么只有这个用于 Log4j 的 Java 导入语句有效,而另一个无效?
【发布时间】:2015-03-13 00:54:47
【问题描述】:

我很好奇 Java 导入的工作原理。例如,我刚刚运行了这个示例 log4j 代码,但它没有编译:

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;



public class log4jExample{
  /* Get actual class name to be printed on */
  static Logger log = Logger.getLogger(
                      log4jExample.class.getName());

  public static void main(String[] args)
                throws IOException,SQLException{

     log.debug("Hello this is an debug message");
     log.info("Hello this is an info message");
  }
}

它给出了这个错误:

3 errors found:
File: C:\Users\adel\Desktop\various_topics\new_Java_Code\log4jExample.java  [line: 1]
Error: package org.apache.log4j does not exist
File: C:\Users\adel\Desktop\various_topics\new_Java_Code\log4jExample.java  [line: 13]
Error: cannot find symbol
  symbol:   class Logger
  location: class log4jExample
File: C:\Users\adel\Desktop\various_topics\new_Java_Code\log4jExample.java  [line: 13]
Error: cannot find symbol
  symbol:   variable Logger
  location: class log4jExample

但后来我有了另一个类,它有这样的导入:

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

public class HelloWorldLog4J {

而且这个工作正常。我只是好奇,Java 实际上在哪里找到那些导入的库? 谢谢

【问题讨论】:

  • 具体是什么编译错误?
  • What is a classpath? 答案大多是关于运行时类路径,但同样适用于编译时间。
  • 导入的库在您的类路径中,log4j 类在 log4j jar 文件中。
  • @Rogue - 在 .我想我开始明白了,Sotirious 提供的链接有帮助
  • 也许我不明白你的问题,但你的导入语句看起来像import org.apache.log4j.Logger;,你说它不起作用但import org.apache.logging.log4j.Logger; 起作用。请注意,您的导入缺少“log4j”之前的“日志记录”部分?这可能是您的不完整的原因,因为它不完整。

标签: java import


【解决方案1】:

import 语句是一项功能,它允许您在源代码中使用类型(和/或其成员)的简单名称,而不是完全限定名称。例如,隐含的

import java.lang.*;

添加到所有java编译单元(.java源文件)允许您编写

String variable = "";

而不是

java.lang.String variable = "";

当您编译源代码时,编译器需要能够识别您使用的类型,以便判断您是否正确使用它们。典型的javac compiler 有以下-cp 选项

-cp path-classpath path

指定在哪里可以找到用户类文件,以及(可选)注释处理器和源文件。这个类路径覆盖 CLASSPATH 环境变量中的用户类路径。如果两者都没有 CLASSPATH, -cp or -classpath 指定,用户类路径 由当前目录组成。有关更多信息,请参阅设置类路径 详情。

此选项允许您指定任何已编译的.class 文件的位置(提取的或在库存档中,例如:.jar)。

当您编译代码时,大概是通过 IDE 或构建工具,实际执行的代码类似于

javac -cp "/some/folder/with/classes:log4j2.jar" com/example/log4jExample.java

换句话说,它指的是包含所有日志记录类的 log4j2 库。您收到编译错误,因为您的类路径不包含名为 org.apache.log4j.Logger 的类,因此编译器无法验证您尝试执行的操作。在您的第二次尝试中,类路径确实包含一个名为 org.apache.logging.log4j.LogManager 的类(以及其他类)。


org.apache.log4j.Logger 是 log4j 1 的一部分。它不是 log4j 2 的一部分。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2019-01-03
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多