用类路径编译javac

用类路径编译javac,java,compilation,classpath,Java,Compilation,Classpath,我想知道在编译而不是执行时是否可以在类路径中包含jar。目前,我正在检查是否可以找到我的PostgreSQL驱动程序 出于测试目的,所有东西都在同一位置,所以 program/ DriverCheck.java DriverCheck.class postgresql-longassname.jar java包含 public class DriverCheck { public static void main(String[] args) {

我想知道在编译而不是执行时是否可以在类路径中包含jar。目前,我正在检查是否可以找到我的PostgreSQL驱动程序

出于测试目的,所有东西都在同一位置,所以

program/
    DriverCheck.java
    DriverCheck.class
    postgresql-longassname.jar
java包含

public class DriverCheck {

    public static void main(String[] args) {

        try {
            Class.forName("org.postgresql.Driver");
            System.out.println(Driver Found);
        } catch(Exception log) {
            System.out.println(Driver Not Found);
        }

    }

}
如果我像平常一样编译和执行这个

# javac DriverCheck.java

# java -cp ".:./postgresql-longassname.jar" DriverCheck
它在我得到输出时工作

Driver Found
Driver Not Found
但是,如果我尝试以这种方式编译和执行

# javac -cp ".:./postgresql-longassname.jar" DriverCheck.java

# java DriverCheck
当我得到输出时,它不工作

Driver Found
Driver Not Found
为什么会这样?我有没有办法使用第二种方法来包含jar

为什么会这样?我有没有办法使用第二种方法来包含jar

这是因为为编译指定类路径只是告诉编译器在哪里查找类型。编译器不会将这些类型复制到其输出中——因此,如果您希望在执行时获得相同的可用资源,则需要在执行时指定类路径

在这种情况下,编译器根本不需要额外的jar文件-源代码中没有任何内容引用它。。。但你在执行时确实需要它。。。这就是为什么你最初的方法有效而第二种方法无效

为什么会这样?我有没有办法使用第二种方法来包含jar

这是因为为编译指定类路径只是告诉编译器在哪里查找类型。编译器不会将这些类型复制到其输出中——因此,如果您希望在执行时获得相同的可用资源,则需要在执行时指定类路径


在这种情况下,编译器根本不需要额外的jar文件-源代码中没有任何内容引用它。。。但你在执行时确实需要它。。。这就是为什么您最初的方法有效,而您的第二种方法无效。

我很欣赏这一透彻的解释,我显然误解了javac如何处理jar文件我很欣赏这一透彻的解释,我显然误解了javac如何处理jar文件