设置Java类路径的注意事项

现在有一个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张图片

一、设置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.javajava -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
设置Java类路径的注意事项_第2张图片
图3
设置Java类路径的注意事项_第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
设置Java类路径的注意事项_第4张图片
图5
设置Java类路径的注意事项_第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]



参考文献:
[1]http://stackoverflow.com/questions/219585/setting-multiple-jars-in-java-classpath

你可能感兴趣的:(语言)