Làm thế nào để xây dựng lọ từ IntelliJ đúng cách?


519

Tôi có một dự án chứa một mô-đun duy nhất và một số phụ thuộc. Tôi muốn tạo một jar, trong một thư mục riêng, có chứa mô-đun được biên dịch. Ngoài ra, tôi muốn có các phụ thuộc hiện diện bên cạnh mô-đun của mình.

Bất kể tôi xoay quá trình "xây dựng bình" của IntelliJ như thế nào, đầu ra của mô-đun của tôi dường như trống rỗng (bên cạnh tệp META-INF).

Câu trả lời:


602

Đây là cách xây dựng một cái bình với IntelliJ 10 http://blogs.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

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

Ở trên đặt "bộ xương" vào nơi bình sẽ được lưu vào. Để thực sự xây dựng và lưu nó, hãy làm như sau:

Trích xuất vào mục tiêu Jar

đồng ý

Xây dựng | Xây dựng tạo tác | Xây dựng

Hãy thử giải nén tệp .jar từ

Tên dự án | ra | hiện vật | ProjectName_jar | ProjectName.jar


9
Không thành công khi một số lớp trong jar bao gồm của bạn được ký với RSA.
Asif Shahzad

1
@AsifShahzad xem câu trả lời này để xây dựng các tệp jar có phụ thuộc đã ký: stackoverflow.com/questions/41746177/ .

5
Phương pháp này vẫn không thành công, tệp jar không thực thi
samuel owino

6
Có vẻ như ai đó đã thực sự làm việc rất chăm chỉ để không làm cho nó hoạt động. Thật là xấu hổ vì nó không bao giờ hoạt động. Tôi đã thử ít nhất 50 câu trả lời khác nhau và không có câu trả lời nào hiệu quả. Và câu chuyện của nó giống nhau mỗi lần. Bây giờ tôi dành một tuần để chỉ sản xuất nó như một cái bình vì mọi người trong công ty chúng tôi nghĩ rằng đó là một nỗ lực thực sự cần phải đi vào việc sản xuất một cái bình đầu ra.
Tuyệt vời

2
Như nhiều người đã viết trước tôi, đây là một sự đơn giản hóa mà đôi khi hoạt động. Vui lòng xem câu trả lời của @zsolt tolvali bên dưới. Sẽ là tốt nếu theo quan điểm của IntelliJ để làm cho quá trình tạo JAR trở thành HOẠT ĐỘNG DEFAULT khi tạo một dự án mới, bởi vì rất ít người không cần nó!
Etamar Laron

256

Đây vẫn là một vấn đề trong năm 2017, tôi hy vọng nó sẽ giúp được ai đó ngoài kia! Tôi đã tìm thấy 2 khả năng để tạo jar-s hoạt động trong IntelliJ 2017.2

1. Tạo vật phẩm từ IntelliJ:

  • Đi đến cấu trúc dự án:

Danh sách dữ liệu

  • Tạo một tạo tác mới:

Tạo một tạo tác mới

  • Chọn lớp chính và chắc chắn thay đổi thư mục tệp kê khai:

nhập mô tả hình ảnh ở đây

Bạn phải thay đổi thư mục tệp kê khai:

<project folder>\src\main\java 

thay thế "java" bằng "tài nguyên"

<project folder>\src\main\resources

Đây là cách nó sẽ trông như thế nào:

cách chính xác cho bảng kê khai mới

  • Sau đó, bạn chọn các phụ thuộc những gì bạn muốn được đóng gói trong jar của bạn hoặc NEAR tệp jar của bạn

  • Để xây dựng cổ vật của bạn, hãy xây dựng các tạo tác và chọn "xây dựng lại". Nó sẽ tạo một thư mục "out" với tệp jar của bạn và các phụ thuộc của nó.

nhập mô tả hình ảnh ở đây

2. Sử dụng maven-assembly-plugin

Thêm phần xây dựng vào tệp 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>
  • Tạo cấu hình chạy / gỡ lỗi mới:

Tạo cấu hình chạy / gỡ lỗi mới:

  • Chọn ứng dụng:

Chọn ứng dụng

  • Điền vào mẫu
  • Thêm mục tiêu maven "lắp ráp: đơn" sau khi xây dựng để được thực hiện lần cuối

nhập mô tả hình ảnh ở đây

Thiết lập cuối cùng

  • Lưu nó, sau đó chạy

nhập mô tả hình ảnh ở đây

Quy trình này sẽ tạo tệp jar trong thư mục "đích"

Vị trí tệp JAR


7
thay đổi thư mục tệp kê khai thành src / resource là điểm chính !!! cảm ơn ~
fantouch

3
Con đường MANIFEST này là con đường quan trọng nhất, cảm ơn @Zsolt Tolvaly
fruqi

2
Tôi đã nhận được no main manifest attributethông qua các giải pháp trên. Không ai đề cập đến việc thay đổi path to manifest. Thnx !!
Prometheus

1
đây sẽ là câu trả lời hàng đầu Cảm ơn!
Giorgos Lamprakis

Làm thế nào về mã nguồn trong scala? java không phải là thứ tôi đang sử dụng
Kiwy

135

Gần đây tôi đã có vấn đề này và nghĩ rằng các bước này rất dễ thực hiện nếu bất kỳ giải pháp hoặc liên kết trước nào bị thiếu chi tiết.

Cách tạo .jarbằng IntelliJ IDEA 14.1.5:

  1. Tập tin> Lưu tất cả.
  2. Chạy trình điều khiển hoặc lớp với phương thức chính.
  3. Tệp> Cấu trúc dự án.
  4. Chọn Tab "Tạo tác".
  5. Nhấp vào nút cộng màu xanh lá cây gần đầu cửa sổ.
  6. Chọn JAR từ menu thả xuống. Chọn "Từ các mô-đun có phụ thuộc"
  7. Chọn lớp chính.
  8. Nút radio phải được chọn "trích xuất vào JAR mục tiêu." Nhấn OK.
  9. Đánh dấu vào ô "Build on make"
  10. Nhấn áp dụng và OK.
  11. Từ menu chính, chọn thả xuống xây dựng.
  12. Chọn tùy chọn xây dựng tạo tác.

1
bạn đã bỏ lỡ điều gì? Có một tùy chọn về mô-đun nên là gì. Trong trường hợp của tôi, nó tạo JAR nhưng lỗi JVM do bảo mật.
sonus21

Tôi nghĩ rằng danh sách đó là tất cả. Bạn có thể có một cái gì đó với các thiết lập java của bạn dừng nó do bảo mật. Có ai khác có suy nghĩ về điều này?
dùng5442490

Đã làm theo như vậy và tôi có Lỗi: Không thể tìm hoặc tải lớp chính JavaFundamentals.jar khi chạy tệp jar này. Giải thích tại đây: stackoverflow.com/questions/40636790/ từ
laggerok19

Có phải thực hiện quy trình 12 bước này mỗi lần tôi muốn xây dựng một cái bình hay IntelliJ sẽ nhớ những hành động này để bạn có thể sử dụng phím tắt cho nó?
Andy

31

Đối với những người được hưởng lợi từ hình ảnh như tôi làm:

File -> Project Structure

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


4
@samuelowino tôi không đánh giá cao bạn nói điều đó. Giải thích những gì "hoàn toàn không hoạt động".
Crt

1
Xin chào @Crt Tôi đã không kiểm tra đúng tệp jar, rõ ràng, Inteliji đã tạo ra hai tệp jar trên các thư mục khác nhau, xin lỗi, xấu của tôi, giải pháp của bạn hoạt động, cảm ơn
samuel owino

15

Dưới đây là 2 ví dụ với dự án maven, từng bước một:

Phương pháp 1: Xây dựng jar với maven và pom.xml

  1. Tệp, mới, dự án, maven
  2. tạo một gói, tạo một chương trình java bên trong gói đó nhập mô tả hình ảnh ở đây
  3. tại pom.xml, thêm 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>

chụp màn hình: nhập mô tả hình ảnh ở đây 4. mở hộp dự án maven bằng cách nhấp vào biểu tượng tìm kiếm và nhập maven, nhập mô tả hình ảnh ở đây

  1. bấm vào sạch, sau đó bấm vào cài đặt nhập mô tả hình ảnh ở đây

  2. tập tin jar của bạn sẽ hiển thị bên trong thư mục đích nhập mô tả hình ảnh ở đây

  3. kiểm tra bình của bạn bằng cách sử dụng java -jar

nhập mô tả hình ảnh ở đây

Phương pháp 2: Xây dựng jar với maven mà không thay đổi pom.xml

  1. Tệp, mới, dự án, maven
  2. tạo một gói, tạo một chương trình java bên trong gói đó (giống như trên)
  3. File-> Project Structure-> Project Settings-> Artifacts-> Nhấp green plus sign-> Jar->From modules with dependencies

Rất quan trọng!

MANIFEST.MF cần có trong thư mục tài nguyên của bạn và Main.Class cần tham khảo {gói} - {class-name-that-chứa-main-class}

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

  1. sau đó nhấp vào xây dựng trên menu, xây dựng các tạo tác, xây dựng

nhập mô tả hình ảnh ở đây

  1. tìm bình trong thư mục

nhập mô tả hình ảnh ở đây

  1. chạy nó :)

nhập mô tả hình ảnh ở đây


những công việc này. Bạn có thể giải thích tại sao MANIFEST.MF cần phải nằm trong thư mục đó không?
Ubeogesh

Điều này giúp cho tôi
Devendra SingAF

5

Có lẽ hơi muộn, nhưng tôi đã giải quyết theo cách này -> mở bằng winrar và xóa ECLIPSEF.RSA và ECLIPSEF.SF trong thư mục META-INF, hơn nữa, đặt "Main-class: main_ class_name" (không có "class" ) trong MANIFEST.MF. Đảm bảo rằng bạn đã nhấn "Enter" hai lần sau dòng cuối cùng, nếu không nó sẽ không hoạt động.


Đối với các phụ thuộc đã ký, vui lòng xem câu trả lời này: stackoverflow.com/questions/41746177/NH

Thật là một vấn đề điên rồ. Bất kỳ ý tưởng tại sao điều này xảy ra hoặc làm thế nào để khắc phục? Điều này cảm thấy khó chịu
Andrew No

5

Khi tôi sử dụng các giải pháp này, lỗi này sẽ đến:

java -jar xxxxx.jar

không có thuộc tính tệp kê khai chính, trong xxxxx.jar

và giải pháp là :

Bạn phải thay đổi thư mục tệp kê khai:

<project folder>\src\main\java 

thay đổi java thành tài nguyên

<project folder>\src\main\resources

Whew, cuối cùng, cảm ơn vì tiền boa!
ám chỉ

@rendon Chúc may mắn nhé!
Saeed

Hoàn hảo !. Điều này hoạt động tốt
jafarmlp

2

Tôi đã cố gắng xây dựng một jar từ một ứng dụng Kotlin đa mô-đun và nhận được lỗi 'không có thuộc tính biểu hiện chính' khét tiếng. Tạo thư mục tệp kê khai src/main/resourcescũng không hoạt động.

Thay vào đó, nó hoạt động khi tạo nó srctrực tiếp : src/META-INF/MANIFEST.MF.

nhập mô tả hình ảnh ở đây


Xin chào, Cảm ơn nó hoạt động tốt. Nhưng bây giờ tôi có một lỗi mới là nó không tìm thấy tài nguyên "java.desktop / javax.swing.ImageIcon java.lang.NullPulumException"
Shivam Mathur

2

nhập mô tả hình ảnh ở đây

Như những người ở trên nói, nhưng tôi phải lưu ý một điểm. Bạn phải kiểm tra hộp kiểm:

Bao gồm trong xây dựng dự án


1

Ý tưởng 8.1.3

Jar vẫn ổn, vì có đầu ra được biên dịch trong thư mục 'output' (dự án / out / sản xuất //)

Tôi đoán, bạn phải chạy 'make' trước khi xây dựng jar

đối với phần phụ thuộc, chỉ cần kiểm tra "thư viện hiển thị" và chọn những gì bạn muốn.


1

Với Maven, bạn có thể sử dụng plugin này:

 <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>

0

Bạn có thể muốn xem Maven ( http://maven.apache.org ). Bạn có thể sử dụng nó làm quá trình xây dựng chính cho ứng dụng của mình hoặc chỉ để thực hiện một số tác vụ nhất định thông qua hộp thoại Chỉnh sửa cấu hình. Quá trình tạo JAR của một mô-đun trong Maven khá đơn giản, nếu bạn muốn nó bao gồm tất cả các phụ thuộc trong một JAR tự thực hiện cũng tầm thường.

Nếu bạn chưa từng sử dụng Maven trước đây thì bạn muốn đọc Bản dựng tốt hơn với Maven .


8
Maven rõ ràng là chi phí cho một nhiệm vụ đơn giản như tạo bình. Có lẽ Ant nhưng không maven cho chắc chắn.
Juriy

Liên kết đã chết (tháng 10 năm 2014)
KathyA.

1
@KathyA. Cảm ơn - đã cập nhật để sử dụng các đề xuất của nhóm Maven.
Gary Rowe

5
Nếu nó quá tầm thường, tại sao không đưa nó vào câu trả lời của bạn?
nuzzolilo

1
Bởi vì tôi mong người đọc ghé thăm trang web và bắt đầu quá trình học tập.
Gary Rowe

0

Nếu bạn đang sử dụng thư viện của bên thứ ba với dự án của mình hoặc nếu bạn gặp vấn đề với việc tạo tệp MANIFEST.MF đúng cách, có thể có xung đột khi chạy tệp JAR được tạo bằng cách sử dụng

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

phương pháp đã đề cập ở trên.

Thay vào đó tôi đề nghị bạn tạo một JAR trống và thêm tất cả các yếu tố khác vào gốc đầu ra. Một bài viết blog tuyệt vời cho phương pháp này có thể được tìm thấy ở đây: http://karthicraghupathi.com/2016/07/10/creating-an-executable-jar-in-intellij-idea/ Tôi đã thử các bước được đề cập ở đó và mọi thứ đều hoạt động tốt cho tôi!


Cảm ơn, điều này đã giúp tôi! Dường như có một lỗi trong Intellij trong đó bảng kê khai của dự án được ghi đè trong JAR bởi một bảng kê khai mặc định nếu bạn chọn "JAR" làm loại tạo tác thay vì "Khác".
đỏ

0

Một số câu trả lời khác là vô ích vì ngay sau khi bạn nhập lại dự án IntelliJ IDEA từ dự án maven, tất cả các thay đổi sẽ bị mất.

Việc xây dựng jar cần được kích hoạt bằng cấu hình chạy / gỡ lỗi, không phải bởi các cài đặt dự án.

Jetbrains có một mô tả hay về cách bạn có thể thực hiện điều này tại đây:

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

Cuộn xuống phần có tên "Định cấu hình kích hoạt cho mục tiêu Maven".

(Nhược điểm duy nhất trong mô tả của họ là ảnh chụp màn hình của họ nằm trong bảng màu đen trắng mặc định thay vì chủ đề darcula siêu tuyệt vời. Ugh!)

Vì vậy, về cơ bản, những gì bạn làm là bạn mở bảng điều khiển "Dự án Maven", bạn tìm thấy dự án quan tâm, (trong trường hợp của bạn, dự án xây dựng bình của bạn,) bên dưới nó bạn tìm thấy mục tiêu maven mà bạn muốn thực hiện , (thường là mục tiêu "gói" tạo ra các lọ,) bạn mở menu ngữ cảnh trên nó, (nhấp chuột phải vào máy Windows) và sẽ có tùy chọn "Thực thi trước khi chạy / gỡ lỗi ..." mà bạn có thể chọn và nó sẽ đưa bạn bằng tay từ đó. Thật sự dễ dàng.


0

Trong trường hợp bạn đang cố gắng xây dựng một cái bình bằng kotlin, bạn cần tạo một src/main/javathư mục và sử dụng thư mục này làm vị trí cho thư mục META-INF.


0

Dưới đây là câu trả lời chính thức của Trợ giúp IntelliJ IDEA 2018.3 . Tôi đã thử và nó đã làm việc.

Để xây dựng tệp JAR từ một mô-đun;

  1. Trên menu chính, chọn Build | Xây dựng Cổ vật.

  2. Từ danh sách thả xuống, chọn tạo phẩm mong muốn của loại JAR. Danh sách hiển thị tất cả các tạo phẩm được cấu hình cho dự án hiện tại. Để xây dựng tất cả các tạo phẩm được cấu hình, chọn tùy chọn Xây dựng tất cả các tạo phẩm.


0

Vấn đề của tôi là thế này: Tôi đã sử dụng Intellij IDEA (đã thử các phiên bản khác nhau) + Gradle. Khi tôi biên dịch dự án và xây dựng jar artifacf, như được chỉ ra trong các phản hồi ở trên, tôi đã nhận được một lỗi - "không có bản kê khai chính ..."

Giải pháp này hiệu quả với tôi (đặc biệt cảm ơn Thilina Ashen Gamage (xem ở trên) về mẹo):

Trích dẫn - nếu bạn sử dụng các thư viện bên ngoài và xây dựng dự án thông qua Cài đặt dự án - Artifacts - Thêm (+) - Jar - Từ các mô-đun có phụ thuộc , thì có lẽ do lỗi chương trình thư mục META-INF với tệp MANIFEST_MF không bao gồm tệp jar. Để tránh nó tạo tập tin jar EMPTY .

Cài đặt dự án - Tạo tác - Thêm (+) - Jar - JAR EMPTY . Thư mục META-INF sẽ được thêm vào thư mục tài nguyên . Sau đó chọn lớp chính của bạn. Bạn sẽ thấy cấu trúc jar sau: lưu ý sự hiện diện của thư mục META-INF Lưu ý sự hiện diện của thư mục META-INF Sau đó, bạn có thể xây dựng dự án của mình và xây dựng các tạo phẩm. Giải pháp này cũng hoạt động cho các ứng dụng javaFX.


-1

Nếu bạn đang làm việc trên dự án spring / mvn, bạn có thể sử dụng lệnh này:

mvn package -DskipTests

Các tập tin jar sẽ được lưu trên directoy mục tiêu.


-3

Ant và Maven được sử dụng rộng rãi. Tôi thích Ant, tôi cảm thấy nó nhẹ hơn và bạn là nhà phát triển kiểm soát nhiều hơn. Một số người cho rằng đó là nhược điểm của nó :-)


3
Điều này không có gì để giải thích tại sao lỗi xảy ra.
baordog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.