Jak prawidłowo budować słoiki z IntelliJ?

519

Mam projekt, który zawiera jeden moduł i pewne zależności. Chciałbym utworzyć słoik, w osobnym katalogu, który zawiera skompilowany moduł. Ponadto chciałbym mieć zależności obecne obok mojego modułu.

Niezależnie od tego, jak przekręcę proces „kompilacji jar” IntelliJ, wyjście mojego modułu wydaje się puste (oprócz pliku META-INF).

ripper234
źródło

Odpowiedzi:

602

Oto jak zbudować słoik z IntelliJ 10 http://blogs.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

File-> Project Structure-> Project Settings-> Artifacts-> Kliknij green plus sign-> Jar->From modules with dependencies...

Powyżej ustawia „szkielet” do miejsca, w którym zostanie zapisany słoik. Aby faktycznie zbudować i zapisać, wykonaj następujące czynności:

Wyciąg do docelowego słoika

ok

Kompilacja | Zbuduj artefakt | Budować

Spróbuj wyodrębnić plik .jar

Nazwa projektu | obecnie | artefakty | ProjectName_jar | ProjectName.jar

EpicPandaForce
źródło
9
Nie udaje się, gdy niektóre klasy w dołączonym słoju są podpisane za pomocą RSA.
Asif Shahzad
1
@AsifShahzad zobaczyć tę odpowiedź dla budowania pliki jar z podpisanych zależności: stackoverflow.com/questions/41746177/... .
5
Ta metoda nadal nie działa, plik jar nie uruchamia się
samuel owino
6
Wygląda na to, że ktoś naprawdę ciężko pracował, aby nie zadziałało. Szkoda, że ​​to nigdy nie działa. Próbowałem co najmniej 50 różnych odpowiedzi i żadna z nich nie zadziałała. I za każdym razem to ta sama historia. Teraz rezerwuję tydzień, aby wyrzucić go jako słoik, ponieważ wszyscy w naszej firmie uważają, że to prawdziwy wysiłek, który należy podjąć, aby wyprodukować słoik wyjściowy.
Niesamowite
2
Jak wielu napisało przede mną, jest to uproszczenie, które kiedyś działa. Zobacz odpowiedź @zsolt tolvali poniżej. Z punktu widzenia IntelliJ dobrze byłoby uczynić proces tworzenia JAR DOMYŚLNĄ AKTYWNOŚCIĄ podczas tworzenia nowego projektu, ponieważ niewiele osób go nie potrzebuje!
Etamar Laron
255

To wciąż jest problem w 2017 roku, mam nadzieję, że pomoże komuś tam! Znalazłem 2 możliwości tworzenia działających słoików pod IntelliJ 2017.2

1. Tworzenie artefaktu z IntelliJ:

  • Przejdź do struktury projektu:

Menu Plik

  • Utwórz nowy artefakt:

Utwórz nowy artefakt

  • Wybierz główną klasę i pamiętaj o zmianie folderu manifestu:

wprowadź opis zdjęcia tutaj

Musisz zmienić katalog manifestu:

<project folder>\src\main\java 

zamień „java” na „zasoby”

<project folder>\src\main\resources

Tak powinno to wyglądać:

poprawny sposób na nowy manifest

  • Następnie wybierasz zależności, które chcesz spakować W słoiku lub W POBLIŻU pliku jar

  • Aby zbudować artefakt, przejdź do budowania artefaktów i wybierz opcję „odbuduj”. Stworzy folder „out” z plikiem jar i jego zależnościami.

wprowadź opis zdjęcia tutaj

2. Korzystanie z wtyczki maven-assembly-plugin

Dodaj sekcję kompilacji do pliku pom

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <finalName>ServiceCreate</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <archive>
                        <manifest>
                            <mainClass>com.svt.optimoo.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • Utwórz nową konfigurację uruchamiania / debugowania:

Utwórz nową konfigurację uruchamiania / debugowania:

  • Wybierz aplikację:

Wybierz aplikację

  • Wypełnić formularz
  • Dodaj „maven: pojedynczy” cel maven po kompilacji, która ma zostać wykonana jako ostatnia

wprowadź opis zdjęcia tutaj

Ostateczna konfiguracja

  • Zapisz, a następnie uruchom

wprowadź opis zdjęcia tutaj

Ta procedura utworzy plik jar w folderze „docelowym”

Lokalizacja pliku JAR

Zsolt Tolvaly
źródło
6
kluczowym punktem jest zmiana katalogu manifestu na src / resources !!! dzięki ~
fantouch
3
Ta ścieżka MANIFESTU jest najbardziej krytyczna, dzięki @Zsolt Tolvaly
fruqi
2
Zacząłem no main manifest attributeprzyjmować powyższe rozwiązania. Nikt nie wspominał o zmianie path to manifest. Dziękuję !!
Prometeusz
1
to powinna być najlepsza odpowiedź. Dzięki!
Giorgos Lamprakis
co powiesz na kod źródłowy w scala? java nie jest tym, czego używam
Kiwy
135

Niedawno miałem ten problem i uważam, że te kroki są łatwe do wykonania, jeśli jakiekolwiek wcześniejsze rozwiązanie lub link nie zawiera szczegółów.

Jak utworzyć za .jarpomocą IntelliJ IDEA 14.1.5:

  1. Plik> Zapisz wszystko.
  2. Uruchom sterownik lub klasę za pomocą metody głównej.
  3. Plik> Struktura projektu.
  4. Wybierz zakładkę „Artefakty”.
  5. Kliknij zielony przycisk plus w górnej części okna.
  6. Wybierz JAR z rozwijanego menu Dodaj. Wybierz „Z modułów z zależnościami”
  7. Wybierz główną klasę.
  8. Przycisk opcji powinien wybrać „wypakuj do docelowego pliku JAR”. Wciśnij OK.
  9. Zaznacz pole „Build on make”
  10. Naciśnij Zastosuj i OK.
  11. Z menu głównego wybierz menu rozwijane kompilacji.
  12. Wybierz opcję artefakty kompilacji.
5442490
źródło
1
coś przegapiłeś? Istnieje opcja dotycząca modułu, która powinna być. W moim przypadku jest to tworzenie JAR, ale JVM przez błąd z powodu bezpieczeństwa.
sonus21
myślę, że ta lista jest wszystkim. Być może coś z ustawieniami Java zatrzymało to ze względów bezpieczeństwa. Czy ktoś jeszcze o tym myśli?
user5442490,
Postępowałem tak samo i mam błąd: Nie można znaleźć lub załadować JavaFundamentals.jar głównej klasy podczas uruchamiania tego pliku jar. Wyjaśniono tutaj: stackoverflow.com/questions/40636790/…
laggerok19
Czy ten 12-etapowy proces musi być wykonywany za każdym razem, gdy chcę zbudować słoik, czy też IntelliJ zapamięta te działania, aby można było użyć do niego skrótu?
Andy,
31

Dla tych, którzy korzystają z obrazów tak jak ja:

File -> Project Structure

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Crt
źródło
4
@samuelowino Nie podoba mi się, że to mówisz. Wyjaśnij, co „w ogóle nie działa”.
Crt
1
Hej @ Crt Nie sprawdzałem właściwego pliku jar, najwyraźniej Inteliji wyprodukowało dwa pliki jar w różnych katalogach, przeprosiny, moje złe, twoje rozwiązanie działa, dzięki
samuel owino
15

Oto 2 przykłady krok po kroku z projektem maven:

Metoda 1: Zbuduj słoik z maven i pom.xml

  1. Plik, nowy, projekt, maven
  2. utwórz pakiet, utwórz program Java w tym pakiecie wprowadź opis zdjęcia tutaj
  3. na pom.xml dodaj wtyczkę maven-jar-plugin.

        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>somePackage.sample</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

zrzut ekranu: wprowadź opis zdjęcia tutaj 4. otwórz okno projektu maven, klikając ikonę wyszukiwania i wpisz maven, wprowadź opis zdjęcia tutaj

  1. kliknij czysty, a następnie kliknij zainstaluj wprowadź opis zdjęcia tutaj

  2. Twój plik jar pojawi się w folderze docelowym wprowadź opis zdjęcia tutaj

  3. przetestuj swój słoik za pomocą java -jar

wprowadź opis zdjęcia tutaj

Metoda 2: Zbuduj słoik z maven bez zmiany pom.xml

  1. Plik, nowy, projekt, maven
  2. utwórz pakiet, utwórz program Java w tym pakiecie (tak samo jak powyżej)
  3. File-> Project Structure-> Project Settings-> Artifacts-> Kliknij green plus sign-> Jar->From modules with dependencies

Bardzo ważne!

Plik MANIFEST.MF musi znajdować się w folderze zasobów, a klasa Main.Class musi odnosić się do {pakietu} - {nazwa-klasy-zawierającej-klasę główną}

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

  1. następnie kliknij buduj w menu, buduj artefakty, buduj

wprowadź opis zdjęcia tutaj

  1. znajdź słoik w folderze wyjściowym

wprowadź opis zdjęcia tutaj

  1. Uruchom :)

wprowadź opis zdjęcia tutaj

rrr
źródło
to działa. Czy możesz wyjaśnić, dlaczego plik MANIFEST.MF musi znajdować się w tym katalogu?
Ubeogesh
To mi pomaga
Devendra Singraul
5

Prawdopodobnie jest już trochę za późno, ale udało mi się to rozwiązać w ten sposób -> otwórz za pomocą winrar i usuń ECLIPSEF.RSA i ECLIPSEF.SF w folderze META-INF, a ponadto umieść „Klasa główna: nazwa_klasy głównej” (bez „.class” ) w pliku MANIFEST.MF. Upewnij się, że nacisnąłeś „Enter” dwa razy po ostatnim wierszu, w przeciwnym razie nie zadziała.

Baka
źródło
W przypadku podpisanych zależności zapoznaj się z tą odpowiedzią: stackoverflow.com/questions/41746177/…
Co za szalony problem. Masz pomysł, dlaczego tak się dzieje lub jak to naprawić? To wydaje się hacking
Andrew No
5

Gdy korzystam z tych rozwiązań, pojawia się następujący błąd:

java -jar xxxxx.jar

brak głównego atrybutu manifestu w xxxxx.jar

i rozwiązaniem jest :

Musisz zmienić katalog manifestu:

<project folder>\src\main\java 

zmień java na zasoby

<project folder>\src\main\resources
Saeed
źródło
Uff, wreszcie dzięki za napiwek!
rendon,
@rendon Powodzenia whew!
Saeed,
Doskonały !. To działa dobrze
jafarmlp
2

Próbowałem zbudować słoik z wielomodułowej aplikacji Kotlin i otrzymałem notoryczny błąd „brak głównego atrybutu manifestu”. Utworzenie katalogu manifestu src/main/resourcesrównież nie działało.

Zamiast tego, działa podczas tworzenia go srcbezpośrednio: src/META-INF/MANIFEST.MF.

wprowadź opis zdjęcia tutaj

Tobias Uhmann
źródło
Cześć, dzięki, że działa dobrze. Ale teraz mam nowy błąd, że nie można znaleźć zasobów „java.desktop / javax.swing.ImageIcon java.lang.NullPointerException”
Shivam Mathur
2

wprowadź opis zdjęcia tutaj

Jak mówią ludzie powyżej, ale muszę zwrócić uwagę na jeden punkt. Musisz zaznaczyć pole wyboru:

Uwzględnij w kompilacji projektu

Benchur Wong
źródło
1

Pomysł 8.1.3

Słoik jest w porządku, ponieważ w katalogu „output” znajduje się skompilowane wyjście (project / out / production //)

Myślę, że musisz uruchomić „make” przed budowaniem słoika

dla zależności po prostu zaznacz „pokaż bibliotekę” i wybierz, co chcesz.

Vugluskr
źródło
1

Dzięki Maven możesz użyć tej wtyczki:

 <build>
    <plugins>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>[path you class main]</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Fede Beron
źródło
0

Możesz rzucić okiem na Maven ( http://maven.apache.org ). Możesz użyć go jako głównego procesu kompilacji aplikacji lub po prostu wykonać określone zadania za pomocą okna dialogowego Edytuj konfiguracje. Proces tworzenia pliku JAR modułu w Maven jest dość trywialny, jeśli chcesz, aby zawierał on wszystkie zależności w wykonywalnym pliku JAR, który również jest trywialny.

Jeśli nigdy wcześniej nie korzystałeś z Maven, to chcesz przeczytać Better Builds With Maven .

Gary Rowe
źródło
8
Maven jest oczywiście narzutem w przypadku prostych zadań, takich jak tworzenie słoika. Może Ant, ale na pewno nie maven.
Juriy
Link is dead (paź 2014)
KathyA.
1
@KathyA. Dzięki - zaktualizowano, aby użyć zaleceń zespołu Maven.
Gary Rowe
5
Jeśli jest to tak trywialne, dlaczego nie dołączyć go do swojej odpowiedzi?
nuzzolilo
1
Ponieważ chciałbym, aby czytelnik odwiedził witrynę i rozpoczął proces uczenia się.
Gary Rowe
0

Jeśli używasz bibliotek stron trzecich w swoim projekcie lub masz problemy z prawidłowym tworzeniem pliku MANIFEST.MF, mogą wystąpić konflikty podczas uruchamiania plików JAR wygenerowanych przy użyciu

File > Project Structure > Artifacts > '+' > JAR > From modules with dependencies > .....

metoda wspomniana powyżej.

Zamiast tego sugeruję, aby utworzyć pusty plik JAR i ręcznie dodać wszystkie inne elementy do wyjściowego katalogu głównego. Cudowny artykuł na blogu dotyczący tej metody można znaleźć tutaj: http://karthicraghupathi.com/2016/07/10/creating-an-executable-jar-in-intellij-idea/ Próbowałem tam wymienionych kroków i wszystko działało dobrze dla mnie!

Thilina Ashen Gamage
źródło
Dzięki, pomogło mi to! Wygląda na to, że w programie Intellij występuje błąd, w którym manifest projektu jest zastępowany w pliku JAR domyślnym manifestem, jeśli jako typ artefaktu wybrano „JAR” zamiast „Inne”.
czerwony
0

Niektóre inne odpowiedzi są bezużyteczne, ponieważ jak tylko ponownie zaimportujesz projekt IntelliJ IDEA z projektu maven, wszystkie zmiany zostaną utracone.

Budowanie słoika musi być uruchamiane przez konfigurację uruchamiania / debugowania, a nie przez ustawienia projektu.

Jetbrains ma ładny opis tego, jak możesz to zrobić tutaj:

https://www.jetbrains.com/help/idea/maven.html

Przewiń w dół do sekcji „Konfigurowanie wyzwalaczy dla celów Maven”.

(Jedyną wadą ich opisu jest to, że ich zrzuty ekranu mają domyślny schemat kolorów czarno-biały zamiast super niesamowitego motywu darcula. Ugh!)

Zasadniczo wystarczy, że otworzysz panel „Projekty Maven”, znajdziesz interesujący projekt (w twoim przypadku projekt, który buduje twój słoik), pod nim znajdziesz cel raju, który chcesz wykonać , (zwykle cel „pakiet” tworzy słoiki), otwierasz na nim menu kontekstowe (kliknij prawym przyciskiem myszy na komputerze z systemem Windows) i pojawi się opcja „Wykonaj przed uruchomieniem / debugowaniem ...” wybierz, a stamtąd zabierze Cię za rękę. Naprawdę proste.

Mike Nakis
źródło
0

Jeśli próbujesz zbudować słoik z kotlinem, musisz utworzyć src/main/javafolder i użyć tego folderu jako lokalizacji dla folderu META-INF.

Chris
źródło
0

Oto oficjalna odpowiedź Pomocy IntelliJ IDEA 2018.3 . Próbowałem i działało.

Aby zbudować plik JAR z modułu;

  1. W menu głównym wybierz Kompiluj | Zbuduj Artefakt.

  2. Z rozwijanej listy wybierz żądany artefakt typu JAR. Lista pokazuje wszystkie artefakty skonfigurowane dla bieżącego projektu. Aby zbudować wszystkie skonfigurowane artefakty, wybierz opcję Zbuduj wszystkie artefakty.

Sabri Meviş
źródło
0

Mój problem polegał na tym: użyłem Intellij IDEA (wypróbowałem różne wersje) + Gradle. Kiedy skompilowałem projekt i zbudowałem słoik artifacf, jak wskazano w powyższych odpowiedziach, otrzymałem błąd - „brak głównego manifestu…

To rozwiązanie zadziałało dla mnie (specjalne podziękowania dla Thiliny Ashen Gamage (patrz wyżej) za wskazówkę):

Fragment - jeśli korzystasz z bibliotek zewnętrznych i budujesz projekt poprzez Ustawień projektu - Artefakty - Dodaj (+) - Jar - Z modułów zależnych , to prawdopodobnie z powodu błędu programu folder META-INF z plikiem MANIFEST_MF nie zawiera jar. Aby tego uniknąć, utwórz PUSTY plik jar.

Ustawienia projektu - Artefakty - Dodaj (+) - Słoik - PUSTY JAR . Folder META-INF zostanie dodany do folderu zasobów . Następnie wybierz swoją główną klasę. Zobaczysz następującą strukturę słoika: zwróć uwagę na obecność folderu META-INF Zwróć uwagę na obecność folderu META-INF Następnie możesz zbudować swój projekt i zbudować artefakty. To rozwiązanie działało również w aplikacjach javaFX.

Orkhan Hasanli
źródło
-1

Jeśli pracujesz nad projektem spring / mvn, możesz użyć tego polecenia:

mvn package -DskipTests

Plik jar zostanie zapisany w docelowym directoy.

Hans Pour
źródło
-3

Mrówka i Maven są szeroko stosowane. Wolę Ant, wydaje mi się, że jest lżejszy, a Ty, deweloper, masz większą kontrolę. Niektórzy sugerują, że to jego minus :-)

Brian
źródło
3
Nie wyjaśnia to, dlaczego występuje błąd.
baordog