gpt4 book ai didi

java - 在类路径中使用星号通过命令行运行 Java 程序时不起作用

转载 作者:行者123 更新时间:2023-12-01 12:45:31 29 4
gpt4 key购买 nike

我试图从 Eclipse 教程中手动编译 HelloWorldSWT.java,所以我使用了

$ javac -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_*.jar HelloWorldSWT.java

编译程序,它成功了。但是当我尝试像这样运行它时

$ java -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_*.jar:. HelloWorldSWT

抛出NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display
at HelloWorldSWT.main(HelloWorldSWT.java:19)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Display
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more

我尝试在路径中添加引号

$ java -cp "/opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_*.jar:." HelloWorldSWT

但它也不起作用。

然后我尝试了各种类路径组合来让它运行,我使用 eclipse 的调试视角来查看它如何运行我的程序,它看起来像这样:

/usr/lib/jvm/jdk1.7.0_51/bin/java \
-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:60185 \
-Djava.library.path=/home/joyeecheung/workspace/org.eclipse.swt.gtk.linux.x86 \
-Dfile.encoding=UTF-8 \
-classpath /home/joyeecheung/workspace/HelloWorldSWT/bin:/opt/eclipse/plugins/org.eclipse.swt_3.103.0.v20140605-2008.jar:/home/joyeecheung/workspace/org.eclipse.swt.gtk.linux.x86/bin \
HelloWorldSWT

好吧,他们没有使用星号,所以我尝试了

$ javac -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_3.103.0.v20140605-2012.jar HelloWorldSWT.java
$ java -cp /opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_3.103.0.v20140605-2012.jar:. HelloWorldSWT

编译并运行它,它起作用了。

所以我想知道为什么当我使用星号时,Java 似乎无法找到该类?

我使用的是 Ubuntu 12.04 和 oracle jdk 1.7.0_51。我尚未将当前目录 . 添加到我的 $CLASSPATH 环境变量中。 HelloWorldSWT 程序如下所示:

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class HelloWorldSWT {

public static void main(String[] args) {
// TODO Auto-generated method stub
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Hello World!");
shell.open();
while(!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}

}

最佳答案

来自(http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html):

理解类路径通配符

类路径条目可以包含基本名称通配符,这被认为相当于指定目录中扩展名为.jar或.JAR的所有文件的列表。例如,类路径条目 foo/ 指定名为 foo 的目录中的所有 JAR 文件。仅由 * 组成的类路径条目将扩展为当前目录中所有 jar 文件的列表。

在您的情况下,请尝试 java -cp/opt/eclipse/plugins/* 而不是 java -cp/opt/eclipse/plugins/org.eclipse.swt.gtk.linux。 x86_*.jar

关于java - 在类路径中使用星号通过命令行运行 Java 程序时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24738770/

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