Zainstalowałem aplikację, kiedy próbuję ją uruchomić (jest to plik wykonywalny), nic się nie dzieje. Kiedy uruchamiam go z wiersza poleceń za pomocą:
java -jar „app.jar”
Otrzymuję następujący komunikat:
brak głównego atrybutu manifestu w „app.jar”
Normalnie, gdybym sam stworzył program, dodałbym główny atrybut klasy do pliku manifestu. Ale w tym przypadku, ponieważ plik pochodzi z aplikacji, nie mogę tego zrobić. Próbowałem też wyodrębnić słoik, aby sprawdzić, czy mogę znaleźć klasę główną, ale istnieje wiele klas i żadna z nich nie ma słowa „main” w nazwie. Musi istnieć sposób, aby to naprawić, ponieważ program działa poprawnie w innych systemach.
javap
. Możesz jednak odpakować plik i sprawdzić, czy faktycznie nie ma manifestu.Odpowiedzi:
Po pierwsze, to trochę dziwne, gdy widzisz, jak biegniesz,
java -jar "app"
a niejava -jar app.jar
Po drugie, aby jar mógł być wykonywalny ... musisz zgarnąć plik o nazwie META-INF / MANIFEST.MF
sam plik powinien mieć (przynajmniej) jedną linijkę:
Gdzie
com.mypackage.MyClass
jest klasa posiadająca publiczny punkt wejścia static void main (String [] args) .Zauważ, że jest kilka sposobów, aby to zrobić za pomocą CLI, Maven, Ant lub Gradle:
W przypadku interfejsu wiersza polecenia wystarczy wykonać następujące polecenie: (tks @ dvvrt )
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
W przypadku Maven coś takiego jak poniższy fragment kodu powinno wystarczyć. Zauważ, że jest to tylko definicja wtyczki, a nie pełna pom.xml :
(Wybierz
<version>
odpowiedni dla swojego projektu.)W przypadku Anta poniższy fragment powinien pomóc:
Kredyty Michael Niemand -
Dla Gradle :
źródło
lib
folder, wystarczy wykonać jar za pomocąjava -jar myproject.jar
i znajdzie zależności.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
element w pliku Maven wygenerowanym przez VSC, więc właśnie<configuration>
do niego dodałem sekcję.To powinno być
java -jar app.jar
zamiastjava -jar "app"
.Ta
-jar
opcja działa tylko wtedy, gdy plik JAR jest wykonywalnym plikiem JAR, co oznacza, że musi on zawierać plik manifestu zMain-Class
atrybutem. Zobacz Pakowanie programów w plikach JAR, aby dowiedzieć się, jak utworzyć wykonywalny plik JAR.Jeśli nie jest to wykonywalny plik JAR, musisz uruchomić program z czymś takim jak:
gdzie
com.somepackage.SomeClass
jest klasa, która zawieramain
metodę uruchamiania programu. (Czym jest ta klasa, zależy od programu, nie można stwierdzić na podstawie dostarczonych informacji).źródło
META-INF
katalogu w pliku JAR). Powinien zawieraćMain-Class
atrybut, który podaje nazwę głównej klasy.Alternatywnie możesz użyć wtyczki maven-assembly-plugin, jak pokazano w poniższym przykładzie:
W tym przykładzie wszystkie słoiki zależności określone w sekcji zostaną automatycznie dołączone do pojedynczego słoika. Zauważ, że jar-z-zależnościami należy dosłownie umieścić jako, a nie zastępować je nazwami plików jar, które chcesz dołączyć.
źródło
maven-assembly-plugin
działało.maven-jar-plugin
nie.pom.xml
pliku,<build><plugins> PUT IT HERE </plugins></build>
a następnie uruchom pakiet maven (w menu przesuwnym IDEA otwórz maven po prawej stronie, poszukaj projektu> Cykl życia> pakiet). Wtedy twój plik jar będzie w folderze docelowym. Twoje zdrowie!Wynika to z faktu, że Java nie może znaleźć atrybutu Main w pliku MANIFEST.MF. Atrybut Main jest niezbędny, aby powiedzieć java, której klasy powinien użyć jako punktu wejścia aplikacji. W pliku jar plik MANIFEST.MF znajduje się w folderze META-INF. Zastanawiasz się, jak możesz spojrzeć na zawartość słoika? Otwórz plik jar w WinRAR.
Główny atrybut w pliku MANIFEST.MF wygląda następująco:
Ten błąd „brak głównego atrybutu manifestu” pojawia się, gdy brakuje tego wiersza w pliku MANIFEST.MF.
Określenie tego atrybutu w pliku MANIFEST.MF jest naprawdę ogromnym bałaganem.Aktualizacja: Właśnie znalazłem naprawdę fajny sposób na określenie punktu wejścia aplikacji w środowisku Eclipse. Kiedy mówisz Eksportuj,
źródło
Miałem ten sam problem. dodając następujące wiersze do pliku pom, sprawiło, że działało. Wtyczka zapewni proces kompilacji aplikacji wraz ze wszystkimi niezbędnymi krokami.
źródło
<parent>...</parent>
poleciłeś z aplikacji w pliku pom.xml. Domyślam się, że jeśli odwiedzimyparent
plik pom.xml aplikacji, otrzymamy jasny pomysł.repackage-classifier
. Proszę odwiedzić docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…Odpowiedzią Gradle jest dodanie ustawienia jar / manifest / atrybuty w następujący sposób:
źródło
Miałem ten problem podczas tworzenia słoika za pomocą IntelliJ IDEA. Zobacz tę dyskusję .
Rozwiązaniem dla mnie było odtworzenie artefaktu jar, wybierając JAR> Z modułów z zależnościami, ale nie akceptując domyślnego katalogu dla META-INF / MANIFEST.MF. Zmień go z - / src / main / java na - / src / main / resources.
W przeciwnym razie zawierał plik manifestu w słoiku, ale nie ten, który powinien mieć w katalogu - / src / main / java.
źródło
W przypadku maven rozwiązało to (dla mnie, dla bazy kodowej Veetle na GitHub):
Twoje zdrowie...
źródło
mvn package shade:shade
samo uruchomieniemvn package
nie spowodowało uruchomienia wtyczki cieniowania.Wypróbuj to polecenie, aby dołączyć jar:
źródło
Dla mnie żadna z odpowiedzi tak naprawdę nie pomogła - miałem plik manifestu we właściwym miejscu, zawierający klasę główną i wszystko. To, co mnie potknęło, to:
( źródło ). Dodanie nowej linii na końcu manifestu naprawiło to.
źródło
Jeśli korzystasz z Maven, dołącz do pom
źródło
no main manifest attribute
błędu, ale pracuję nad aplikacją rozruchu wiosennego, więc ta odpowiedź pomogła mi. Wiedziałem już, jak utworzyćMETA-INF/MANIFEST.MF
plik, ale nie wiem, jak automatycznie uruchamia go Spring-boot.spring-boot
zignoruj to. Stackoverflow pomaga również w budowaniu własnego repozytorium problemów, z którym napotykasz podczas programowania.Miałem dzisiaj ten sam problem. Mój problem został rozwiązany, przenosząc META-INF do folderu zasobów.
źródło
Właśnie dostałem ten sam błąd. Jeśli używasz
gradle
, po prostu dodaj następny w swoimgradle.build
:Gdzie
com.company.project.MainClass
ścieżka do twojej klasy zpublic static void main(String[] args)
metodą.źródło
mainClassName
zestawu zmiennych najwyższego poziomu , ale to pomaga tylko wgradle run
poleceniach, a nie w tworzeniu pliku wykonywalnego .jarProblem MAVEN polega na tym, że stara się dołączyć pierwszy plik MANIFEST.MF z pierwszej biblioteki z zależności zamiast NASZYCH WŁASNYCH MANIFEST.MF KIEDY UŻYWAĆ ARTYKUŁÓW! .
Skopiuj prawdziwy plik MANIFEST.MF, który już wygenerował w twoim projekcie przez MAVEN. Obejmuje to, że:
Manifest-Version: 1.0 Main-Class: yourpacket.yourmainclass (na przykład info.data.MainClass)
Zamień na nią zawartość pliku MANIFEST.MF z youjar.zip.
LUB!
Po prostu stwórz własny plik MANIFEST.MF i:
Ale jeśli używasz panelu maven (lub wiersza poleceń maven), możesz zmusić go do wygenerowania własnego manifestu i włączenia go do pliku JAR.
Dodaj do sekcji kompilacji pom.xml ten kod:
Otwórz panel MAVEN (w Intellij) i uruchom „Instaluj”. Wygeneruje plik MANIFEST i skompiluje właściwość plik JAR ze wszystkimi zależnościami w folderze „Target”. Zostanie również zainstalowany w lokalnym repozytorium maven.
źródło
Jeśli słoik nie jest zgodny z regułami , nie jest słojem wykonywalnym.
źródło
Napotkałem ten sam problem i teraz został rozwiązany :) Wykonaj poniższe kroki, a błąd może dotyczyć wszystkiego, ale poniższe kroki sprawiają, że proces jest płynniejszy. Spędzam dużo czasu, aby znaleźć poprawkę.
1. Spróbuj ponownie uruchomić Eclipse (jeśli używasz Eclipse do zbudowania pliku JAR) -> W rzeczywistości pomogło to w moim problemie z prawidłowym eksportowaniem pliku JAR.
2.Po ponownym uruchomieniu zaćmienia sprawdź, czy zaćmienie jest w stanie rozpoznać główną klasę / metodę według projektu Java -> kliknij prawym przyciskiem myszy -> Uruchom jako -> Uruchom konfiguracje -> Główne -> kliknij przycisk Wyszukaj aby sprawdzić, czy twoje zaćmienie jest w stanie wyszukać twoją główną klasę w pliku JAR. -> Służy do sprawdzania, czy plik JAR będzie miał punkt wejścia do klasy głównej.
Następnie wyeksportuj swój projekt Java Dynamic jako plik „Runnable JAR”, a nie plik JAR.
W konfiguracji uruchamiania Java wybierz swoją główną klasę.
Po wyeksportowaniu pliku jar użyj poniższego polecenia, aby wykonać. java -cp [Your JAR] .jar [pełny pakiet] .MainClass np .: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Możesz napotkać nieobsługiwany błąd wersji Java. poprawka polega na zmianie java_home w profilu bash powłoki, aby pasował do wersji java użytej do skompilowania projektu w środowisku eclipse.
Mam nadzieję że to pomoże! Daj mi znać, jeśli nadal masz jakieś problemy.
źródło
Miałem ten sam problem. Wiele z wymienionych tutaj rozwiązań nie dało mi całego obrazu, więc postaram się przedstawić streszczenie sposobu pakowania plików jar z wiersza poleceń .
Jeśli chcesz mieć swoje
.class
pliki w paczkach, dodaj pakiet na początku.java
.Test.java
Aby skompilować kod z
.class
plikami kończącymi się na strukturze podanej przez nazwę pakietu, użyj:-d .
Sprawia, że kompilator utworzyć strukturę katalogów chcesz.Podczas pakowania
.jar
pliku musisz poinstruować procedurę dotyczącą słoika, jak ją spakować. Tutaj korzystamy z zestawu opcjicvfeP
. Ma to na celu zachowanie struktury pakietu (opcjaP
), określenie punktu wejścia, aby plik manifestu zawierał znaczące informacje (opcjae
). Opcjaf
pozwala określić nazwę pliku, opcjac
tworzy archiwum, a opcjav
ustawia wyjście na pełne. Ważnymi rzeczami do odnotowania tutaj sąP
ie
.Potem pojawia się nazwa słoika, którego chcemy
test.jar
.Potem przychodzi punkt wejścia.
A potem przychodzi,
-C . <packagename>/
aby pobrać pliki klas z tego folderu, zachowując strukturę folderów.Sprawdź
.jar
plik w programie zip. Powinien mieć następującą strukturętest.jar
Plik MANIFEST.MF powinien zawierać następujące elementy
Jeśli edytujesz manifest ręcznie, pamiętaj, aby zachować nowy wiersz na końcu, w przeciwnym razie Java go nie rozpozna.
Wykonaj swój
.jar
plik za pomocąźródło
Osobiście uważam, że wszystkie odpowiedzi tutaj źle rozumieją pytanie. Odpowiedź na to pytanie polega na tym, jak wiosenny rozruch buduje plik .jar. Wszyscy wiedzą, że Spring Boot konfiguruje taki manifest, który różni się od przypuszczenia każdego, że jest to standardowe uruchomienie .jar, którym może być lub nie:
Być może trzeba go wykonać
org.springframework.boot.loader.JarLauncher
na ścieżce klas?źródło
Każdy plik wykonywalny jar powinien być uruchamiany poprzez kliknięcie lub uruchomienie przy użyciu wiersza polecenia, takiego jak java -jar app.jar (użyj „jeśli ścieżka jar zawiera spację” - tj. Java -jar „C: \ nazwa folderu \ app.jar”). Jeśli plik wykonywalny nie działa, co oznacza, że nie został poprawnie utworzony.
Aby lepiej zrozumieć, wyodrębnij plik jar (lub wyświetl za pomocą dowolnego narzędzia, w systemie Windows 7-Zip jest fajny) i sprawdź plik w /META-INF/MANIFEST.MF. Jeśli znajdziesz jakikolwiek wpis
Klasa główna: twoja.nazwa_pliku.ClaaswithMain - wtedy jest w porządku, w przeciwnym razie musisz go podać.
Pamiętaj o dołączeniu pozycji klasy głównej do pliku MANIFEST.MF, sprawdź, gdzie ją zapisujesz!
źródło
Możesz po prostu wykonać ten krok. Utwórz plik jar za pomocą
Podczas uruchamiania pliku jar wystarczy uruchomić w ten sposób
źródło
Być może nie utworzyłeś poprawnie pliku jar:
Następujące prace:
źródło
Jeśli używasz wiersza poleceń do skompilowania .jar, możesz wskazać główny bez dodawania pliku manifestu. Przykład:
(param „e” robi to: TheNameOfClassWithMainMethod to nazwa klasy z metodami main () i app.jar - nazwa pliku wykonywalnego .jar i * .class - tylko wszystkie pliki klas do złożenia)
źródło
Dla mnie ten błąd wystąpił po prostu dlatego, że zapomniałem powiedzieć Eclipse, że chciałem uruchomić plik jar, a nie zwykły plik jar biblioteki. Dlatego podczas tworzenia pliku jar w Eclipse upewnij się, że kliknąłeś prawy przycisk opcji
źródło
Powyższe odpowiedzi były dla mnie tylko częściowo pomocne.
java -cp
było częścią odpowiedzi, ale potrzebowałem bardziej szczegółowych informacji o tym, jak zidentyfikować klasę do uruchomienia. Oto, co zadziałało dla mnie:Krok 1: znajdź klasę, którą muszę uruchomić
Najważniejsze linie wyniku to:
Klasa App.class zawierała główną klasę do uruchomienia. Nie jestem w 100% pewien, czy zawsze możesz założyć, że klasa, której potrzebujesz, jest pierwsza, ale była dla mnie. Jeśli tak nie jest, wyobrażam sobie, że nie jest zbyt trudno użyć grep do wykluczenia wyników związanych z biblioteką, aby sprowadzić listę klas do rozsądnego rozmiaru.
Stamtąd było łatwo: po prostu używam tej ścieżki (minus sufiks „.class”):
źródło
java -cp ... somepackage.App
.Ponieważ dodałeś plik MANIFEST.MF, myślę, że powinieneś rozważyć kolejność pól w tym pliku. Moja env to
java version "1.8.0_91"
i mój MANIFEST.MF jak tutaj
Jednak, jak pokazano poniżej
źródło
(pierwszy post - więc może nie być czysty)
To jest moja poprawka dla OS X 11.6, programu Netbeans 8.2 opartego na Maven. Do tej pory moja aplikacja jest w 100% Netbeans - bez poprawek (tylko kilka ucieczek powłoki dla niemożliwego!).
Po wypróbowaniu większości odpowiedzi tutaj i gdzie indziej bezskutecznie powróciłem do sztuki „używaj tego, co działa”.
Najlepsza odpowiedź tutaj ( olivier-refalo thanx) wyglądała na właściwe miejsce na rozpoczęcie, ale nie pomogła.
Patrząc na inne projekty, które się sprawdziły, zauważyłem niewielkie różnice w liniach manifestu:
Nie jestem pewien, dlaczego (jestem tylko 3 miesiące do java) lub jak, ale mogę tylko powiedzieć, że to zadziałało.
Oto zastosowany zmodyfikowany blok manifestu:
źródło
Znalazłem nowe rozwiązanie złego generowania manifestów!
Kliknij na META-INF
Dodaj lub edytuj
Dodaj:
Utwórz plik tekstowy o nazwie MANIFEST.MF w folderze o nazwie META-INF i dodaj następujący wiersz:
Zapisz plik i dodaj go do pliku zip
Edytować:
Otwórz cmd i wpisz: java -jar c: /path/JarName.jar
Teraz powinno działać dobrze!
źródło
większość rozwiązań nie działała dla mnie, ale mój instruktor pomógł mi, chciałbym podzielić się jego rozwiązaniem tutaj użyłem terminalu Kali Linux, ale powinno być dobrze we wszystkich debianach
w typie pliku
teraz, aby uruchomić użycie pliku
lub możesz przejść do właściwości pliku i sprawdzić
pomogło mi, a większość powyższych odpowiedzi nie
źródło
Możesz mieć taki sam problem jak ja. Po utworzeniu pliku .jar napisz
jar xf app.jar META-INF/MANIFEST.MF
. Spowoduje to utworzenie kopii pliku do bieżącego katalogu, aby można go było przeczytać. Jeśli mówi tylko coś takiego:i nie zawiera deklaracji „klasy głównej”, więc myślę, że znalazłeś swój problem.
Nie wiem jednak, jak to rozwiązać. Sprawdziłem inne osoby z tymi samymi / podobnymi problemami na StackOverflow i nie mogłem znaleźć odpowiedzi. Jednak dzięki tym informacjom możesz być może uzyskać lepszą pomoc (biorąc pod uwagę fakt, że masz ten sam problem co ja).
Edycja: Próbowałem z plikiem manifestu, ale nie udało mi się go uruchomić, ale moim błędem było nazwanie tylko jednej z klas podczas tworzenia pliku jar. Zamiast tego napisałem * .class i teraz działa.
Chociaż nie wiem, dlaczego istnieje potrzeba utworzenia pliku manifestu. Ale chyba wszystko jest w porządku, dopóki działa.
źródło
Miałem ten problem i rozwiązałem go ostatnio, robiąc to w Netbeans 8 (patrz obrazek poniżej):
źródło