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