现在有一个JAVA项目,项目结构如图1所示。类Main依赖Log4J和Mysql-Connector包,“Base.java”文件只是最简单的类定义,“Main.java”文件内容如下:
package com.dslztx.java;
import org.apache.log4j.Logger;
public class Main extends Base {
private static final Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.info("Hello World");
// depend on mysql
System.out.println(com.mysql.jdbc.Driver.class.getCanonicalName());
}
}
图1
一、设置Java类路径的注意事项
1.1、将JAR包加入类路径
欲将JAR包加入类路径,必须将完整的JAR包路径加入类路径,对于以上项目来说,正确的编译命令和运行命令分别为:javac -classpath "./src:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java和java -classpath "./src:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" com.dslztx.java.Main。
如果“-classpath”选项的值设定为“./src:./lib”,那么编译会报出如图2所示错误,运行会报出如图3所示错误。
图2
图3
1.2、将非JAR包加入类路径
欲将非JAR包(比如配置文件,单独的类文件等)加入类路径,只需将父目录加入类路径即可,加入完整的路径反而导致错误。接下来进行举例说明。
1.2.1、例子1
现在预先编译“Base.java”文件,将得到的“Base.class”文件放在“./com/dslztx/java”目录下(当前目录是“Classpath”目录),此时目录结构如图4所示。正确的编译命令为:javac -classpath ".:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java。如果将编译命令改成:javac -classpath "./com/dslztx/java/Base.class:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java,则会出现如图5所示错误。
图4
图5
1.2.2、例子2
使用javac -classpath "./src:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java编译命令得到编译结果,根据这个结果正确的运行命令应为:java -classpath "./src:./lib:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" com.dslztx.java.Main,Log4J正常运行需要加载类路径下的“log4j.properties”文件,因此在运行命令的类路径中加了“./lib”。如果将运行命令改成java -classpath "./src:./lib/log4j.properties:./lib/mysql-connector-java-5.1.17-bin.jar:./lib/log4j-1.2.13.jar" com.dslztx.java.Main,则会出现如图6所示结果(并不算错误)。
图6
二、小技巧
可以通过“*”通配符将一个目录下的所有JAR包加入类路径,比如要将“lib”目录下的所有JAR包加入类路径,可以通过“lib/*”的形式。千万注意,绝对不能使用“lib/*.jar”的形式,后者是错误的。另外需要注意的是“lib/*”表示的是将“lib”目录下的所有JAR包加入类路径,并没有将“lib”目录下的非JAR包加入类路径。[1]