Windows コマンド プロンプトから Java を実行すると、 NoClassDefFoundErrorの問題が発生します。メインの TestLogger.java ファイルを C:\mywork に配置し、他の 4 つの Java ファイルを C:\mywork\logging に配置して、パッケージとして編成しました。
これらのファイル (javac TestLogger.java) をコンパイルしたり、jar ファイルを作成したりすることは困難ではありませんでしたが、コンパイルされた TestLogger を実行しようとすると失敗し、「スレッド 'main' java.lang.NoClassDefFoundError で例外」が発生しました。
また、Web で検索を行ったところ、このエラーが発生したほとんどの人は、単一の単純な HelloWorld プログラムを実行しようとしているだけであることがわかりました。そこで、C:\mywork で独自の HelloWorld.java を試してみましたが、奇妙なことに、コンパイルと実行に問題はありませんでした。また、環境変数のチェックや -classpath パラメータの後にピリオドを追加するなど、Web で見つけたさまざまな解決策のいずれも、私の場合は奇跡を起こすことができませんでした。
Windows XP で JDK 1.7 を使用しています。環境変数に問題はないと確信しています。以下は私のソースファイルの完全な内容です (Jeff Friesen の第 2 版のLearn Java for Android Development、p. 175 の例)。うまくいけば、誰かがこれに光を当てることができます。前もって感謝します!
C:\mywork には、メインの入り口として 1 つのファイルがあります。
TestLogger.java:
package logging;
import logging.Logger;
import logging.LoggerFactory;
public class TestLogger {
public static void main(String[] args) {
Logger logger = LoggerFactory.newLogger(LoggerFactory.CONSOLE);
if (logger.connect()) {
logger.log("test message #1");
logger.disconnect();
}
else
System.out.println("cannot connect to console-based logger");
logger = LoggerFactory.newLogger(LoggerFactory.FILE, "x.txt");
if (logger.connect()) {
logger.log("test message #2");
logger.disconnect();
}
else
System.out.println("cannot connect to file-based logger");
logger = LoggerFactory.newLogger(LoggerFactory.FILE);
if (logger.connect()) {
logger.log("test message #3");
logger.disconnect();
}
else
System.out.println("cannot connect to file-based logger");
}
}
C:\mywork\logging フォルダーには、次の 4 つのファイルがあります。
1) Logger.java:
package logging;
public interface Logger {
boolean connect();
boolean disconnect();
boolean log(String msg);
}
2) Console.java:
package logging;
public class Console implements Logger {
private String dstName;
Console(String dstName) {
this.dstName = dstName;
}
@Override
public boolean connect() {
return true;
}
@Override
public boolean disconnect() {
return true;
}
@Override
public boolean log(String msg) {
System.out.println(msg);
return true;
}
}
3) ファイル.java:
package logging;
public class File implements Logger {
private String dstName;
File(String dstName) {
this.dstName = dstName;
}
@Override
public boolean connect() {
if (dstName == null)
return false;
System.out.println("opening file " + dstName);
return true;
}
@Override
public boolean disconnect() {
if (dstName == null)
return false;
System.out.println("closing file " + dstName);
return true;
}
@Override
public boolean log(String msg) {
if (dstName == null)
return false;
System.out.println("writing "+msg+" to file " + dstName);
return true;
}
}
4) LoggingFactory.java:
package logging;
public abstract class LoggerFactory {
public final static int CONSOLE = 0;
public final static int FILE = 1;
public static Logger newLogger(int dstType, String... dstName) {
switch (dstType) {
case CONSOLE:
return new Console(dstName.length == 0 ? null : dstName[0]);
case FILE:
return new File(dstName.length == 0 ? null : dstName[0]);
default:
return null;
}
}
}