0

これは典型的なエラー メッセージですが、検索結果が役に立ちません。誰かがコーディングしたJavaツールをビルドして実行しようとしています。

次のエラーが表示されます。

Could not find the main class: ConnJKSEngine.  Program will exit.

これが私のマニフェストです:

Main-Class: ConnJKSEngine

私もこれに変更しました

Main-Class: ConnJKSEngine.ConnJKSEngine

Main-Class: ConnJKSEngine/ConnJKSEngine

(最後に改行があります)。違いはありませんでした

これは私がjarを構築する方法です:

javac -cp ConnJKSEngine/ ConnJKSEngine/ConnJKSEngine.java
jar -cvfm ConnJKSEngine.jar ConnJKSEngine/ConnJKSEngineManifest ConnJKSEngine/*.class
chmod +x ConnJKSEngine.jar

これは私がjarを実行しようとする方法です(それらすべてを試しました):

java ConnJKSEngine.jar
java -jar ConnJKSEngine.jar
java -cp ConnJKSEngine.jar ConnJKSEngine

これは、によって与えられた目次です。jar -tf ConnJKSEngine.jar

META-INF/
META-INF/MANIFEST.MF
ConnJKSEngine/ConnJKSEngine.class
ConnJKSEngine/ConnJKSEngine_GenKey.class
ConnJKSEngine/ConnJKSEngine_GetPubKey.class
ConnJKSEngine/ConnJKSEngine_Operation.class
ConnJKSEngine/ConnJKSEngine_PrivDec.class
ConnJKSEngine/ConnJKSEngine_Sign.class

ConnJKSEngineディレクトリに移動してを実行java ConnJKSEngineすると、使用情報が正しく出力されます。これにより、メイン クラスが存在し、実行できることを確認できます。では、jar の作成に何か問題があるに違いありませんよね?

そこで、jar を別のディレクトリ ( ) に解凍し、unzip ConnJKSEngine.zip上記のディレクトリ構造を取得しました。ConnJKSEngineディレクトリに移動しjava ConnJKSEngineて実行すると、正しく実行されます。

ここで私は立ち往生しています:クラスはそこにあり、サブディレクトリにあり、実行できます。マニフェストは正しいようです。私は Java プログラマーではないので、ここに来ました。何が起こっているのでしょうか?(注: Linux システム)

編集ソースはここにあります: https://github.com/Javex/JKSEngine

4

4 に答える 4

1

メインクラスには完全修飾名を付けるConnJKSEngine.ConnJKSEngineか、jar コンテンツを次のようにする必要があると思います。

META-INF/
META-INF/MANIFEST.MF
ConnJKSEngine.class
ConnJKSEngine_GenKey.class
ConnJKSEngine_GetPubKey.class
ConnJKSEngine_Operation.class
ConnJKSEngine_PrivDec.class
ConnJKSEngine_Sign.class
于 2012-08-23T12:26:18.693 に答える
0

マニフェスト テキスト ファイルは、改行またはキャリッジ リターンで終了する必要があります。最後の行は、改行またはキャリッジ リターンで終わらない場合、適切に解析されません。

于 2012-09-03T15:22:37.247 に答える
0

ConnJKSEngine がデフォルト パッケージ (package ステートメントなし) にある場合、ConnJKSEngine.class と他のすべてのクラスは jar ファイルのルートにある必要があります。

于 2012-08-23T12:26:22.213 に答える
0

アップデート

この文を考えると

ConnJKSEngine ディレクトリに移動し、Java ConnJKSEngine を実行しました。使用情報が正しく出力されます。

完全なクラス名は単に ConnJKSEngine、つまりパッケージなしだと思います。この場合、マニフェスト クラスで宣言する必要があります。

Main-Class: ConnJKSEngine

あなたの最初の試みのように、しかしあなたは間違ったパッケージをしました。つまり、すべてのクラスは、プロジェクトにちなんで名付けられたサブディレクトリではなく、アーカイブに直接配置する必要があります(名前の衝突を避けるために、開発者は各クラスの実際の名前の前にプレフィックス - 悪い習慣)。したがって、すべての *.class ファイルを次のように JAR に入れる必要があります

META-INF/
META-INF/MANIFEST.MF
ConnJKSEngine.class
ConnJKSEngine_GenKey.class
ConnJKSEngine_GetPubKey.class
ConnJKSEngine_Operation.class
ConnJKSEngine_PrivDec.class
ConnJKSEngine_Sign.class

次のコマンドを試すことができます

# change to project directory
cd ConnJKSEngine
# compile every *.java file
javac *.java
# build the final archive
jar cmvf jksengine-1.0.jar ConnJKSEngineManifest *.class

javac (コンパイラ) とjar (アーカイバ)のドキュメントは次のとおりです。

于 2012-08-23T12:27:07.913 に答える