为什么只有Log4j的这个Java import语句可以工作,而不是另一个?

时间:2015-03-13 00:54:47

标签: java import

我很好奇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实际上在哪里找到那些导入的库? 感谢

1 个答案:

答案 0 :(得分:2)

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

import java.lang.*;

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

String variable = "";

而不是

java.lang.String variable = "";

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

  

-cp path-classpath path

     

指定在何处查找用户类文件,以及(可选)注释处理器和源文件。此类路径会覆盖   CLASSPATH环境变量中的用户类路径。如果没有   指定了CLASSPATH,-cp-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的一部分。