私は何が悪いのかを見つけるために多くの時間を費やしましたが、それでも答えがありません。だからここに問題があります:
プロジェクトには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)を作成します。