gpt4 book ai didi

java classpath之谜 : either my classes or a jar, 但不是两者都有?

转载 作者:行者123 更新时间:2023-11-30 04:16:39 24 4
gpt4 key购买 nike

考虑以下 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

如果我仅注释掉原始 HelloWorld.java 文件中的 import com.sun.jna; 行,那么一切都会正常工作

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; 行,该行将构造一个 新计算机,并像这样编译:

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。

最佳答案

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

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

请注意,当您不指定类路径时,默认使用当前目录。请参阅http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

关于java classpath之谜 : either my classes or a jar, 但不是两者都有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18177825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com