2015-07-06 15 views
5

Napisałem małą aplikację Java, używając Gradle do jej zbudowania. Aplikacja pochodzi z this tutorial i zawiera 2 klasy: HelloWorld (główna klasa) i Greeter. Plik build.gradle zawiera 2 odcinki (i inne, które są obecnie znaczenia):"Brak głównego atrybutu manifestu" podczas uruchamiania pliku JAR zbudowanego za pomocą Gradle

apply plugin: 'application' 
mainClassName = 'hello.HelloWorld' 

i

dependencies { 
compile "joda-time:joda-time:2.2" 
} 

(jest to konieczne, ponieważ import klasa HelloWorld org.joda.time.LocalTime klasę) . Mogę zbudować aplikację pod numerem gradle build i uruchomić ją pod numerem gradle run. Wszystko jest w porządku i otrzymuję wynik. Jednak gdy próbuję uruchomić go pod numerem java -jar HelloWorld.jar, pojawia się błąd No main manifest attribute. Jednym z rozwiązań znalezionych na StackOverflow zaproponował uruchomienie pliku jako

java -cp HelloWorld.jar hello.HelloWorld 

lub

java -cp HelloWorld.jar HelloWorld 

Pierwszy zwraca Could not find or load main class HelloWorld, drugi wraca java.lang.NotClassDefFoundError" org/joda/time/LocalTime. Archiwum JAR zawiera następujące pliki:

0 Mon Jul 06 13:13:46 CEST 2015 META-INF/ 
25 Mon Jul 06 13:13:46 CEST 2015 META-INF/MANIFEST.MF 
    0 Mon Jul 06 13:13:46 CEST 2015 hello/ 
369 Mon Jul 06 13:13:46 CEST 2015 hello/Greeter.class 
988 Mon Jul 06 13:13:46 CEST 2015 hello/HelloWorld.class 

nie mam pojęcia dlaczego Gradle nie umieścić informacje o główne klasy w pliku manifestu. Masz jakieś sugestie? Kod pochodzi bezpośrednio z samouczka, więc powinno być OK, ale tak nie jest. Powtarzam, że uruchamianie aplikacji przez gradle nie sprawia żadnych problemów.

+0

Możliwy duplikat [Gradle-no główny atrybut manifestu] (http://stackoverflow.com/questions/32567167/gradle-no-main-manifest- attribute) – Xiao

Odpowiedz

2

Ten błąd występuje, ponieważ org.joda.time.LocalTime nie został dodany do ścieżki klasy podczas uruchamiania hello.HelloWorld.

  1. To może być uruchamiany z ścieżce klasy zestaw z: gradle run
  2. Możesz dołączyć tę zależność w słoiku, używając this wtyczki.
  3. Lub przygotuj dystrybucję z zadaniem distZip, rozpakuj ją i użyj skryptu sh lub bat do uruchomienia przygotowanego artefaktu.
Powiązane problemy