4

「staged」というフォルダにたくさんの.jarファイルがあります。

/target
  /staged
    - akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar
    - play_2.10-2.1-RC1.jar
    - etc...

現在のディレクトリが「ターゲット」であるときに、コマンドを実行しようとします

$ java -cp ./staged/* play.core.server.NettyServer ./..
Error: Could not find or load main class ..staged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar

Javaがstaged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jarでメインクラスを探しているのは奇妙なことです。NettyServerクラスは、play_2.10-2.1-RC1.jarと呼ばれる完全に異なる.jarファイル内にあります。Javaは、メインメソッドを見つけるために検索する.jarファイルをどのように決定しますか?

4

5 に答える 5

4

Java は特定の jar ファイルを検索しません。コマンドラインで指定したクラスの結果のクラスパスを検索するだけです。

編集:「-jar」を指定しない限り、MANIFEST.MF ファイルの Main-Class ディレクティブが使用されます。

于 2013-03-21T07:08:30.490 に答える
2

:クラスパスには、空白ではなくコロンで区切られたエントリが含まれている必要があるため、このエラーが発生しています。シェルが展開target/*されると、各ファイルの間にスペースが挿入されます。これにより、Java は最初の jar ファイルのみがクラス パスにあり、2 番目の jar ファイルは実行するクラスの名前であり、残りはコマンドであると「考え」ます。に渡される行パラメータmain

パスを引用符で囲んだ場合、 java* は適切な区切り文字を含むファイルのリストに展開されます。

java -cp "./staged/*" play.core.server.NettyServer ./..

この質問のディレクトリ内のすべてのファイルからクラスパスを作成する他の方法も参照してください。

于 2013-03-21T07:16:47.953 に答える
1

には、MANIFEST.MF次のような行を書く必要があります。

Main-Class: MyPackage.MyClass

次に、このマニフェストを jar に追加すると、jar はどこを見ればよいかを認識します。

于 2013-03-21T07:08:11.927 に答える
1

META-INF フォルダーに配置された .jar に MANIFEST.MF ファイルがあります。

存在しない場合は、新しいものを作成できます。

http://docs.oracle.com/javase/tutorial/deployment/jar/defman.html

コンテンツの例:

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
Main-Class: org.package.MainClass
于 2013-03-21T07:08:31.103 に答える
0

シェルはコマンドラインを展開します

java -cp ./staged/* play.core.server.NettyServer ./..

たとえば

java -cp ./staged/play_2.10-2.1-RC1.jar ./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar  ...  play.core.server.NettyServer ./..

Java は、メイン クラスを検索する./staged/play_2.10-2.1-RC1.jarクラスパスと最初の引数として持つようになりました。./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar

于 2013-03-21T07:21:09.500 に答える