Java非常不寻常的类路径问题

时间:2013-02-27 20:26:53

标签: java jar classpath

我正在尝试使用以下代码运行具有本机库和内容的应用程序:

ProcessBuilder pb = new ProcessBuilder("javaw",
    "-classpath", 
    binDir + "polyrd.jar;" + binDir + "lwjgl.jar;" + binDir + "lwjgl_util.jar;",
    "-Djava.library.path=" + nativesDir,
    "monster860.polyrd.Polyrd");

我尝试在命令行中执行等效操作,将其更改为-cp,只使用bindir而不是binDir + "polyrd.jar;" + binDir + "lwjgl.jar;" + binDir + "lwjgl_util.jar;",并在java和javaw之间切换,但无论我做了什么,它都给了我:

java.lang.NoClassDefFoundError: monster860/polyrd/Polyrd
Caused by: java.lang.ClassNotFoundException: monster860.polyrd.Polyrd
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source) 

有人可以帮忙吗?

我的操作系统是Windows Vista。 是的,这些文件确实存在。

以下是我binDirnativesDir

的方法
public ProcessRunnable(File nativesDir, File binDir) {
        try {
            this.nativesDir = nativesDir.getCanonicalPath() + File.separator;
            this.binDir = binDir.getCanonicalPath() + File.separator;
        } catch (IOException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

编辑: 嗯,当然,它与此完全无关,但下载程序只下载文件的前2 KB。

1 个答案:

答案 0 :(得分:1)

从Java 6开始,“为了特别方便,包含基本名称*的类路径元素被认为等同于指定扩展名为.jar或{的目录中所有文件的列表。 {1}}”。有关详细信息,请参阅java命令行选项。

附录:此示例使用提到的通配符功能启动JFreeChart

.JAR

附录:以下是Windows的更改,需要import java.io.BufferedReader; import java.io.InputStreamReader; /** @see https://stackoverflow.com/a/15121864/230513 */ public class PBTest { private static final String baseDir = "/opt/jfreechart/"; public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("java", "-cp", baseDir + "lib/*:" + baseDir + "jfreechart-1.0.14-demo.jar", "demo.SuperDemo"); pb.redirectErrorStream(true); try { Process p = pb.start(); String s; // read from the process's combined stdout & stderr BufferedReader stdout = new BufferedReader( new InputStreamReader(p.getInputStream())); while ((s = stdout.readLine()) != null) { System.out.println(s); } System.out.println("Exit value: " + p.waitFor()); p.getInputStream().close(); p.getOutputStream().close(); p.getErrorStream().close(); } catch (Exception ex) { ex.printStackTrace(System.err); } } } 作为路径分隔符。

;