java classpath之谜:我的类或jar,但不是两者兼而有之?

时间:2013-08-11 23:43:35

标签: java classpath jna

考虑以下java程序:

import computer_package.Computer;
import com.sun.jna.Library;
public class HelloWorld {
    public static void main(String[] args) {
        Computer computer = new Computer();
        System.out.println("Hello, World");
    }
}

和以下目录结构:

Rebs-MacBook-Pro:jalint2 rebcabin$ find computer_package/
computer_package/
computer_package//Computer.class
computer_package//Computer.java

其中Computer.java如下:

package computer_package;
public class Computer {
    public Computer() {
        System.out.println("Constructor of Computer class.");
    }
    public void computer_method() {
        System.out.println("Power gone! Shut down your PC soon...");
    }
}

和另一个只包含jar个文件的目录:

Rebs-MacBook-Pro:jalint2 rebcabin$ find com
com
com/sun
com/sun/jna
com/sun/jna/jna-4.0.0.jar
com/sun/jna/jna-platform-4.0.0.jar

如果我只注释原始import com.sun.jna;文件中的HelloWorld.java行,那么一切正常

Rebs-MacBook-Pro:jalint2 rebcabin$ javac -g HelloWorld.java 
Rebs-MacBook-Pro:jalint2 rebcabin$ java HelloWorld
Constructor of Computer class.
Hello, World

Javac和java能够找到类文件./computer_package/Computer.class,而无需任何进一步的提示或注释或类路径攻击。

现在,如果我恢复import com.sun.jna;行并仅注释import computer_package.Computer;行并构造一个new Computer的行,并按以下方式编译:

Rebs-MacBook-Pro:jalint2 rebcabin$ javac -g -cp "./com/sun/jna/jna-4.0.0.jar" HelloWorld.java

甚至是这样:

Rebs-MacBook-Pro:jalint2 rebcabin$ make
javac -g -cp "./com/sun/jna/jna-4.0.0.jar:./computer_package" HelloWorld.java

然后一切都还不错:

Rebs-MacBook-Pro:jalint2 rebcabin$ java HelloWorld
Hello, World

至少,import com.sun.jna;行没有抛出编译错误 - 诚然,我不是使用jna库;我只是想在婴儿步骤中努力实现这一重大成就。

因此,如果我现在小心地取消注释import computer_package;行以及构造Computer实例的行,则会在此问题的顶部生成HelloWorld.java文件,尝试使用两个我的Computer班级 jna,所有地狱都破裂了;以前可接受的Computer课程现在无法访问:

Rebs-MacBook-Pro:jalint2 rebcabin$ make
javac -g -cp "./com/sun/jna/jna-4.0.0.jar:./computer_package" HelloWorld.java
HelloWorld.java:20: error: package computer_package does not exist
import computer_package.Computer;
                       ^
HelloWorld.java:25: error: cannot access Computer
        Computer computer = new Computer();
        ^
  bad class file: ./computer_package/Computer.class
    class file contains wrong class: computer_package.Computer
    Please remove or make sure it appears in the correct subdirectory of the classpath.
2 errors
make: *** [HelloWorld.class] Error 1

我知道这是基本的;我不是一个Java专家,我承认我正试图绕着类路径噩梦世界猜测我的方式;我只使用emacs和bash,避免添加更多不透明抽象层的IDE。

1 个答案:

答案 0 :(得分:2)

您需要将类路径指定为包含的目录,而不是包的类,因此如果您从同一目录运行:

javac -g -cp "./com/sun/jna/jna-4.0.0.jar:./"

请注意,如果未指定类路径,则默认使用当前目录。见http://docs.oracle.com/javase/tutorial/essential/environment/paths.html