私は、シミュレーションモデリングパッケージであるVensim用の共有オブジェクトとJavaのインターフェースをとることを可能にすることを意図して、私のJavaコードのコンパイルと実行に問題があります。
次のコードはエラーなしでコンパイルされます。
javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java VensimHelper.Java VensimException.Java VensimContextRepository.Java
しかし、私は以下を実行しようとすると:
Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
「エラー:メインクラスのSpatialModelが見つからないかロードできませんでした」というエラーが表示されます。私のSpatialModel.Javaコードには 'main'メソッド(下記)が含まれているので、問題が何なのかわからない - 誰かが私を手伝ってくれる?ありがとう。
import Java.io.File;
import Java.text.NumberFormat;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
import org.Apache.log4j.Logger;
public class SpatialModel {
private VensimHelper vh;
public static final String DLL_LIBNAME_PARAM = "vensim_lib_nam";
public static final String MODEL_PATH_PARAM = "vensim_model_path";
private final static int VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT = 10;
public SpatialModel() throws SpatialException {
String libName = System.getProperty(DLL_LIBNAME_PARAM);
String modelPath = System.getProperty(MODEL_PATH_PARAM);
if(libName == null || libName.trim().equals("")) {
log.error("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
throw new SpatialException("Vensim library name has to be set with -D" + DLL_LIBNAME_PARAM);
}
if(modelPath == null || modelPath.trim().equals("")) {
log.error("Model path has to set with -D" + MODEL_PATH_PARAM);
throw new SpatialException("Model path ahs to be set with -D" + MODEL_PATH_PARAM);
}
for (int i = 0; i < VENSIM_CONTEXT_CREATION_MAX_FAILURE_COUNT && vh == null; i++) {
try {
log.info("creating new vensim helper\n\tdll lib: " + libName + "\n\tmodel path: " + modelPath);
vh = new VensimHelper(libName, modelPath);
} catch (Throwable e) {
log.error("An exception was thrown when initializing Vensim, try: " + i, e);
}
}
if (vh == null) {
throw new SpatialException("Can't initialize Vensim");
}
}
public static void main(String[] args) throws VensimException {
long before = System.currentTimeMillis();
String libName = System.getProperty(DLL_LIBNAME_PARAM);
String modelPath = System.getProperty(MODEL_PATH_PARAM);
if (libName == null) {
libName = "libvensim";
}
if(modelPath == null) {
modelPath = "~/BassModel.vmf";
}
System.setProperty(DLL_LIBNAME_PARAM, libName);
System.setProperty(MODEL_PATH_PARAM, modelPath);
if (args.length > 0 && args[0].equals("info")) {
System.out.println(new VensimHelper(libName, modelPath).getVensimInfo());
} else if (args.length > 0 && args[0].equals("vars")) {
VensimHelper helper = new VensimHelper(libName, modelPath);
String[] vars = helper.getVariables();
for (String var : vars) {
System.out.println(helper.getVariableInfo(var));
}
} else {
File f = new File(".");
System.out.println(f.getAbsolutePath());
SpatialModel sm = new SpatialModel();
}
System.out.println("Execution time: " + (System.currentTimeMillis() - before));
}
}
.class
ファイルの場所を必ずクラスパスに追加してください。そのため、現在のフォルダにある場合は、クラスパスに.
を追加します。 windowsクラスパスの区切り文字はセミコロン、つまり;
であることに注意してください。
エラーが発生したときにこれら2つを試すことができます:「メインクラスが見つからないかロードできませんでした」
クラスファイルがHelloWorld
プログラム名d:\sample
で次のディレクトリに保存されている場合
Java -cp d:\sample HelloWorld
Java -cp . HelloWorld
現在のディレクトリをJavaクラスパスに追加する必要があると思います
Java -cp .:./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel vars
あなたのjavacとJavaコマンドにクラスパスを含める必要があります
javac -cp . PackageName/*.Java
java -cp . PackageName/ClassName_Having_main
次のものがあるとします。
パッケージ名:com.testクラス名:こんにちは(メインを持つ)ファイルは "src/com/test/Hello.Java"の中にあります
外部ディレクトリから:
$ cd src
$ javac -cp . com/test/*.Java
$ Java -cp . com/test/Hello
eclipseで作業している場合は、プロジェクトのクリーンアップ(project\clean..
clean all projects
)を作成するだけです。
エラーが発生した場合は、クラスパスを設定する必要があります。
メインクラスXYZが見つからないかロードできませんでした
例えば:
E:\>set path="c:\programfiles\Java\jdk1.7.0_17\bin"
E:\>set classpath=%classpath%;.;
E:\>javac XYZ.Java
E:\>Java XYZ
実行しようとしていたため、このエラーが発生しました
javac HelloWorld.Java && Java HelloWorld.class
.class
を削除したはずのとき:
javac HelloWorld.Java && Java HelloWorld
buildPathを確認してください。存在しないライブラリを参照している可能性があります。
JDK 1.6が必要なJavaアプリケーションを実行しようとしていて、JDK 1.4で実行しようとしている場合は、このエラーに遭遇します。一般に、古いJRE上でJavaアプリケーションを実行しようとすると失敗する可能性があります。新しいJRE/JDKをインストールしてみてください
私はこの質問がlinuxでタグ付けされていたことを知っていますが、 windows では、;
ではなく:
でcp引数を区切る必要があるかもしれません。
Java -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar;./vensim.jar SpatialModel vars
http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
このエラーが発生し、 Mavenを使用してJarsを構築している の場合、Javaクラスがsrc/main/Java/
に含まれていない可能性があります。
私の場合は、Eclipseでプロジェクトを作成しました。デフォルトでは(src/main/Java/
ではなく)src
です。
それで私はmypackage.morepackage.myclass
のようなものとsrc/mypackage/morepackage/myclass
のように見えるディレクトリ構造になった、それは本質的に何の問題もありません。しかしmvn clean install
を実行すると、src/main/Java/mypackage/morepackage/myclass
を探します。クラスは見つかりませんが、エラーにはなりません。それでそれはうまく構築され、あなたがあなたの出力されたJarを実行するときあなたは結果が次のようになるでしょう:
Error: Could not find or load main class mypackage.morepackage.myclass
パッケージ化されたJarにクラスが含まれていないからです。
Java -verbose:class HelloWorld
は、どのクラスがロードされているのかを理解するのに役立ちます。
また、前述のように、完全修飾名(つまり、パッケージを含める)を呼び出すことを忘れないでください。
[プロジェクト]> [クリーン]をクリックし、[ビルドパス]> [ライブラリ]に正しいライブラリがあることを確認します。
問題はあなたの主な機能に関するものではありません。チェックアウト
javac -d . -cp ./Apache-log4j-1.2.16/log4j-1.2.16.jar:./vensim.jar SpatialModel.Java VensimHelper.Java VensimException.Java VensimContextRepository.Java
出力して実行します。
あなたがEclipseを使っているなら...私は私のメインクラスファイルの名前を変更し、そのエラーを得ました。 "Run As"コンフィギュレータに行き、そのプロジェクトのクラスパスの下に、両方のファイルをクラスパスにリストしていました。私は名前を変更した古いクラスを削除し、新しい名前を持つクラスをそのままにしてコンパイルして問題なく実行しました。
多くの人が考えるよりも単純な場合、私は含まれています:)
Project Folder/src/package
に移動するとyourClass.Javaが表示されます。次にjavac yourClass.Java
を実行してyourClass.classを作成し、src
フォルダからbuild
に移動します。そこにあなたが走らせることができるフォルダJava package.youClass
私はMac上でターミナルを使用しているか、またはWindows上でコマンドプロンプトを使用して同じタスクを実行できます。
この問題は、既存のプロジェクトをEclipseにインポートしたときに発生しました。何が起こるかというと、パッケージの中ではなく、パッケージの外にあるすべてのファイルがコピーされます。したがって、run> run configurationを実行しようとしたときに、mainメソッドがパッケージに含まれていなかったため、見つけることができませんでした。私がしたのはファイルをパッケージにコピーすることだけで、Eclipseはそれからmainメソッドを検出できました。ですから、最終的には、あなたのJavaファイルが正しいパッケージに入っていることを確認することによって、Eclipseがあなたのメインメソッドを見つけることができることを確認してください。
私はJava 1.8を使用していました、そして私がNetBeansで "Build and clean"を押して、もう一度1.7に切り替え、Okをクリックし、プロパティを再度開いて1.8に戻したところ、このエラーは突然起こりました。
私は私がこれを手伝ってくれることを願っています、これらのエラーはかなり時間がかかることがあります。
私はWindowsで同様の問題を抱えています、それはクラスパスに関連しています。コマンドラインから、Javaファイルが置かれているディレクトリ(* .Javaおよび* .class)までナビゲートしてから、コマンドを再試行してください。
Anypoint Studio(EclipseベースのIDE)を使用しています。私の場合、Javaコードの実行中にまったく異なることが実行されることが判明するまで、すべてがうまく機能しました。それから私は.classファイルを削除しました。この時点で、私はこの質問の題名からエラーメッセージを受け取りました。プロジェクトを掃除しても問題は解決しませんでした。
IDEを再起動した後、すべてうまくいった。
これで今日の問題は解決しました。
cd /path/to/project
cd build
rm -r classes
それからそれをきれいにして構築し、あなたが必要とする個々のファイルを実行します。