Wrong Manifest.mf w IntelliJ IDEA utworzył plik .jar

102

Próbuję spakować projekt przy użyciu bibliotek OptaPlanner 6.0.1 do pliku .jar za pośrednictwem artefaktu jar IntelliJ IDEA, ale zamiast mojego manifestu.mf zawierającego standard

Manifest-Version: 1.0
Main-Class: a.b.c.app

jar wykorzystuje ten dostarczony w ecj-3.7.2.jar, jednej z bibliotek pomocniczych OptaPlanner:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Z tego "no main manifest attribute, in appname.jar"powodu podczas próby uruchomienia aplikacji występuje błąd. Jeśli ręcznie zastąpię manifest w pliku .jar moim, wszystko działa poprawnie. Czy jest coś, co mogę zrobić, aby to naprawić?

Biblioteki trzymam w oddzielnym katalogu / lib i zostały dodane do katalogu głównego artefaktu jar jako Extracted Directory, IntelliJ IDEA to wersja 13.0.1.

grudolf
źródło
1
Czy znasz narzędzia do budowania, takie jak Ant, Maven lub Gradle?
MariuszS
Wiem o nich, ale do tej pory korzystałem tylko z odpowiedników make i .NET (NAnt, MSBuild). Który z nich powinienem wybrać, jeśli narzędzie do kompilacji IntelliJ go nie obsługuje?
grudolf
1
Głosuj tutaj , aby rozwiązać ten problem ,
bigjosh

Odpowiedzi:

260

Miałem ten sam problem.

Upewnij się, że plik MANIFEST.MF znajduje się w:

src/main/resources/META_INF/

NIE

src/main/java/META_INF/
jamhan
źródło
20
To jest rzeczywiście prawidłowa odpowiedź, wydaje się, że Intellij IDEA źle umieszcza folder META-INF, gdy szablon projektu to Maven
Kumait
W moim przypadku musiałem zmienić układ mojego projektu. Wcześniej miałem projekt z układem Mavena, ale usunąłem obsługę Mavena. Odtwarzam projekt od podstaw i teraz działa.
Maxence
1
To nie działało dla mnie, musiałem przenieść plik Mainfest do katalogu głównego projektu.
wyścigi
Czy maven jest tak głupi, że umieszcza ten plik w złym katalogu? : ^)
Daria
@Kumait, problem nadal występuje w IntelliJ 2017.1.5. Zastanawiam się, czy zespół JetBrain jest tego świadomy.
fruqi,
12

Naprawić:

  1. Plik> Struktura projektu
  2. W sekcji Ustawienia projektu po lewej stronie wybierz „Artefakty”
  3. Znajdź definicję JAR w środkowym okienku i wybierz ją
  4. W lewym okienku zakładki „Układ wyjściowy” znajdź plik jar na liście i wybierz go
  5. U dołu kliknij przycisk „Użyj istniejącego manifestu” i wybierz plik manifestu, który znajduje się w źródle projektu.
  6. Kliknij OK i uruchom kompilację
Javaru
źródło
3
Nie ma przycisku „Użyj istniejącego manifestu”, jednak plik manifestu w układzie wyjściowym wskazuje poprawną lokalizację (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf
5
OK, trzeba było usunąć artefakt jar i odtworzyć go, tym razem jako „Pusty” zamiast „Z modułów z zależnościami”. Mam przyciski „Utwórz manifest” i „Użyj istniejącego manifestu”, wskazywały na moje biblioteki manifestu i odczytane oraz kompilację danych wyjściowych. Istnieją dwie różnice w porównaniu z poprzednimi wersjami: META_INF \ MANIFEST.INF jest teraz wyraźnie uwzględniony w układzie wyjściowym, a plik jar wydaje się być generowany poprawnie. :)
grudolf
To nie rozwiązuje problemu, przynajmniej dla mnie. Jednak odpowiedź Jamahna zadziałała.
Andrew Breksa
Komentarz dodany przez użytkownika o niskim poziomie reprezentacji @ ds-Justice w następujący sposób - komentarz @ grudolfa powyżej na temat tworzenia pustego słoika był jedyną rzeczą, która zadziałała dla mnie po kilku godzinach zmagań z importowanym projektem Gradle. To ważne pytanie, rozważ ponowne opublikowanie swojego komentarza jako oddzielnej odpowiedzi.
Shawn Mehan
10

Jak zauważono w komentarzu @ grudolf w jednej z pozostałych odpowiedzi, jednym ze sposobów (i jedynym, który zadziałał dla mnie w zaimportowanym projekcie Gradle) jest utworzenie pustego słoika w następujący sposób:

  • Struktura projektu -> Artefakty -> + Jar -> Pusty
  • W środkowym okienku znajdują się teraz przyciski Utwórz manifest i Użyj istniejącego manifestu. Użyj jednego z nich.
  • Miałem trudności, gdy wyodrębniłem biblioteki zależne z ich własnymi manifestami do katalogu wyjściowego, wydawały się sporadycznie nadpisywać nowy, ręcznie utworzony manifest. Zmienianie kolejności operacji wydawało się działać.

AKTUALIZACJA:

To zdecydowanie błąd w Idea. Ta połączona odpowiedź działa niezawodnie, gdy istnieją wyodrębnione katalogi. W istocie, można znaleźć swoją .idea / JARNAME.xml, dodać należy dodać następujący element na samym szczycie z <root>elementem dla słoika. Wszelkie wyodrębnione elementy znajdujące się powyżej nowej kopii pliku, które zawierają manifest, zablokują nowy manifest.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
Jesień
źródło
7

Jeśli chcesz określić klasę główną, musisz dodać tę wtyczkę do pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
usbo
źródło
1

Miałem podobny problem.

Problem był w pliku pom.xml.

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

Nie wiem z jakiego powodu ten kod działa w zaćmieniu, ale nie w IntelliJ

To jest poprawne.

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf działał !!!

Mam nadzieję, że to pomoże.

marcelocesar
źródło
Miałem dokładnie taką sytuację i doszedłem do tego samego wniosku, co ty: nowe linie między elementami <Dependencies> działały w Eclipse, ale nie w Intellij IDEA.
Arion Krause,
0

Istnieje kilka sposobów generowania plików JAR wykonywalnych. Korzystanie z funkcji GUI IntelliJ jest dobrym sposobem. Innym sposobem jest użycie Mavena (lub podobnie w gradle, buildr itp.), Który jest przyjazny dla serwera kompilacji:

Jest to mniej więcej możliwe do skopiowania z przykładowej kompilacji Optaplanner:

  1. Plik jar użytkownika końcowego (przykłady-optaplanner - *. Jar) musi zawierać ścieżkę klas swoich zależności w swoim manifeście .
  2. Skrypt sh i bat musi następnie odpowiednio uruchomić ten jar.
Geoffrey De Smet
źródło
0

Aby nie mieć problemu takiego jak Manifest, powinieneś mieć katalog o nazwie „META-INF” w katalogu „src”. Więc utwórz go i umieść w nim plik o nazwie „MANIFEST.MF” z następującą zawartością:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

Nie zapomnij zamienić nazwy pakietu zawierającej klasę główną powyżej!

Mohsen Abasi
źródło
5
Zapis pokazuje, że w sierpniu wyciąłem materiał religijny z twojego postu. Zwróć uwagę, że społeczność omawiała dodawanie tematów religijnych do postów, a odpowiedź jest taka, że ​​wolelibyśmy, aby zostały one pominięte. Możesz jednak dodać je do swojego profilu lub awatara.
halfer