Pertanyaan Bagaimana cara Java memutuskan di mana mencari kelas utama?


Saya memiliki banyak file .jar dalam folder bernama "bertahap".

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

Sementara direktori saya saat ini adalah "target", saya mencoba menjalankan perintah

$ 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

Ini aneh bahwa Java mencari kelas utama di staged.akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar. Kelas NettyServer berada di dalam file .jar yang sama sekali berbeda yang disebut play_2.10-2.1-RC1.jar. Bagaimana cara Java memutuskan file .jar mana yang akan dicari untuk menemukan metode utama?


4
2018-03-21 07:06


asal


Jawaban:


Anda mendapatkan kesalahan ini karena jalur kelas harus berisi entri yang dipisahkan oleh titik dua :, dan bukan dengan ruang putih. Ketika shell mengembang target/* itu menempatkan spasi di antara setiap file, yang membuat java "berpikir" hanya file jar pertama di jalur kelas, bahwa file jar kedua adalah nama kelas yang ingin Anda jalankan, dan sisanya adalah parameter baris perintah yang seharusnya diteruskan ke main.

Jika Anda mengutip jalannya, java memperluas * ke daftar file dengan pemisah yang benar:

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

Lihat juga cara lain untuk membuat classpath dari semua file di direktori dalam pertanyaan ini.


1
2018-03-21 07:16



Java tidak mencari file jar tertentu. Ini hanya mencari classpath yang dihasilkan untuk kelas yang telah Anda tentukan pada baris perintah.

Sunting: Kecuali Anda menentukan '-jar', dalam hal ini menggunakan arahan Kelas-Utama dari file MANIFEST.MF.


4
2018-03-21 07:08



Ada file MANIFEST.MF di .jar Anda ditempatkan di folder META-INF.

Anda dapat membuat yang baru jika tidak ada.

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

Contoh konten:

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
Main-Class: org.package.MainClass

1
2018-03-21 07:08



Dalam MANIFEST.MF Anda harus menulis baris seperti ini:

Main-Class: MyPackage.MyClass

Kemudian tambahkan Manifes ini ke toples Anda, dan toples tahu di mana mencarinya.


1
2018-03-21 07:08



Shell memperluas baris perintah Anda

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

misalnya untuk

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 sekarang punya ./staged/play_2.10-2.1-RC1.jar sebagai classpath dan ./staged/akka-slf4j_2.10.0-RC1-2.1.0-RC1.jar argumen pertama, ketika mencari kelas utama.


0
2018-03-21 07:21