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