2

次のコードを使用して、ネイティブ ライブラリなどを持つアプリケーションを実行しようとしています。

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 です。はい、それらのファイルは実際に存在します。

これが私が得た方法binDirですnativesDir

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 のみをダウンロードします。

4

1 に答える 1

1

Java 6 以降、「特別な便宜上、のベース名を含むクラスパス要素は、ディレクトリ内のすべてのファイルのリストを拡張子または」*で指定することと同等と見なされます。詳細については、コマンドライン オプションを参照してください。.jar.JARjava

補遺: この例ではJFreeChart、前述のワイルドカード機能を使用して開始します。

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);
        }
    }
}

補遺:;パスの区切りとして必要な Windows の変更点は次のとおりです。

private static final String baseDir = "C:/Users/Public/JFreeChart/";
public static void main(String[] args) {
    ProcessBuilder pb = new ProcessBuilder("java", "-cp",
        baseDir + "lib/*;" + baseDir + "jfreechart-1.0.14-demo.jar",
        "demo.SuperDemo");
于 2013-02-27T20:35:28.440 に答える