0

私は何が悪いのかを見つけるために多くの時間を費やしましたが、それでも答えがありません。だからここに問題があります:

プロジェクトには2つのクラスがあります。

ProcessTest
|
|-src
  |
  |-testpackage
  | |
  | |-TestClass
  |
  |-AnotherClass

このプロジェクトからjarファイル(アーティファクト)を作成しました。そして、このjarファイルのみを使用してプログラムを動作させたいと思います。

この2つのクラスのコードは次のとおりです。

public class TestClass {

    public static void main(String[] args) {

        String myPath = System.getProperty("user.dir");
        String stringToExecute = String.format("java -classpath \"%s/test.jar\" AnotherClass 0 10", myPath);

        System.out.println("Trying to execute: "+stringToExecute);

        Process process = null;
        try {
            process = Runtime.getRuntime().exec(stringToExecute);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

        BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        StringBuilder text = new StringBuilder();
        String tmp;
        try {
            while ((tmp = errReader.readLine()) != null)
                text.append(tmp + "\n");
        } catch (IOException e) {
            e.printStackTrace();  
        }
        System.out.println(process);
        System.out.println(text);
        System.out.println(process.exitValue());

    }
}

2等:

public class AnotherClass {

    public static void main(String[] args) {
        if (args.length >= 2) {
            int a = Integer.parseInt(args[0]);
            int b = Integer.parseInt(args[1]);
            if (a > b) {
                System.out.println("The first argument should be less or equal than the second argument.");
            } else {
                for (int i=a; i<b; i++) {
                    System.out.println("Number "+i);
                }
            }
        } else {
            System.out.println("Not enough arguments.");
        }
    }

}

興味深いことに、stringToExecuteをターミナルにコピーして貼り付けるだけで、すべてが正常に機能しますが、TestClassでコードを実行しようとすると、次のようになります。

$ java -classpath "/tmp/test.jar" testpackage.TestClass
Trying to execute: java -classpath "/tmp/test.jar" AnotherClass 0 10
java.lang.UNIXProcess@7d67d940
Exception in thread "main" java.lang.NoClassDefFoundError: AnotherClass
Caused by: java.lang.ClassNotFoundException: AnotherClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: AnotherClass.  Program will exit.

1
$

test.jarに含まれるもの:

$ jar tvf /tmp/test.jar 
  0 Mon Aug 27 05:19:16 EEST 2012 testpackage/
  2082 Mon Aug 27 05:19:16 EEST 2012 testpackage/TestClass.class
  1087 Mon Aug 27 05:19:16 EEST 2012 AnotherClass.class
$

ご協力いただきありがとうございます!

PS私はIntelliJIDEAを使用しています(問題がある場合)。たとえば、アーティファクト(test.jar)を作成します。

4

1 に答える 1

0

試す

process = Runtime.getRuntime().exec(new String[]{"java","-cp","/tmp/test.jar", "AnotherClass", "0", "10"});

「/tmp」パスがハードコーディングされ、String配列を使用している。

于 2012-08-27T20:05:28.407 に答える