当在类路径中使用时,星号不能通过命令行运行Java程序

时间:2014-07-14 14:22:53

标签: java

我试图从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();
    }

}

1 个答案:

答案 0 :(得分:1)

从(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