Đã tạo sai Manifest.mf trong IntelliJ IDEA .jar


102

Tôi đang cố gắng đóng gói một dự án bằng cách sử dụng các thư viện OptaPlanner 6.0.1 thành .jar thông qua tạo tác jar của IntelliJ IDEA nhưng thay vì tệp kê khai.mf của tôi có chứa tiêu chuẩn

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

jar sử dụng cái được cung cấp trong ecj-3.7.2.jar, một trong những thư viện hỗ trợ của OptaPlanner:

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

Do đó, một "no main manifest attribute, in appname.jar"lỗi sẽ xảy ra khi cố gắng chạy ứng dụng. Nếu tôi thay thế thủ công tệp kê khai trong tệp .jar bằng tệp của tôi, mọi thứ hoạt động chính xác. Tôi có thể làm gì để sửa lỗi này không?

Tôi giữ các thư viện trong một thư mục / lib riêng biệt và chúng đã được thêm vào thư mục gốc của tạo tác jar là Thư mục được giải nén, IntelliJ IDEA là v13.0.1.


1
Bạn có biết các công cụ xây dựng như ant, maven hoặc gradle không?
MariuszS

Tôi biết về chúng, nhưng cho đến nay tôi chỉ sử dụng các đối tác make và .NET (NAnt, MSBuild). Tôi nên chọn cái nào trong số chúng nếu công cụ xây dựng của IntelliJ không cắt nó?
grudolf

1
Vote để sửa chữa vấn đề này ở đây ,
bigjosh

Câu trả lời:


260

Tôi đã từng gặp vấn đề tương tự.

Đảm bảo MANIFEST.MF của bạn ở trong:

src/main/resources/META_INF/

KHÔNG PHẢI

src/main/java/META_INF/

20
Đây là câu trả lời đúng trên thực tế, có vẻ như Intellij IDEA được đặt sai vị thư mục META-INF khi mẫu dự án là Maven
Kumait

Trong trường hợp của tôi, tôi đã phải thay đổi bố cục của dự án của mình. Trước đây tôi đã có một dự án với bố cục maven nhưng tôi đã loại bỏ sự hỗ trợ của maven. Tôi tạo lại một dự án từ đầu và bây giờ nó hoạt động.
Maxence

1
Điều này không hiệu quả với tôi, tôi phải di chuyển tệp Mainfest đến thư mục gốc của dự án.
racs

Có phải maven ngu ngốc đến mức đặt tập tin này vào sai dir không? : ^)
Daria

@Kumait, sự cố vẫn còn trong IntelliJ 2017.1.5. Tôi tự hỏi liệu nhóm JetBrain có biết điều này không.
leftqi

12

Sửa chữa:

  1. Tệp> Cấu trúc dự án
  2. Trong Cài đặt dự án ở bên trái, chọn "Phần mềm"
  3. Tìm định nghĩa JAR Trong ngăn giữa và chọn nó
  4. Trong ngăn bên trái của tab "Bố trí đầu ra", tìm tệp jar trong danh sách và chọn nó
  5. Ở dưới cùng, nhấp vào nút "Sử dụng Tệp kê khai Hiện có" và chọn tệp kê khai có trong nguồn dự án của bạn.
  6. Nhấp vào OK và chạy bản dựng

3
Không có nút "Sử dụng hiện Manifest", tuy nhiên các tập tin Manifest trong Output Layout được trỏ đến vị trí chính xác (... \ src \ chính \ java \ META-INF \ MANIFEST.MF)
grudolf

5
OK, phải xóa tạo tác jar và tạo lại nó, lần này là "Rỗng" thay vì "Từ mô-đun có phụ thuộc". Có các nút "Tạo Tệp kê khai" và "Sử dụng Tệp kê khai Hiện có", được trỏ đến Tệp kê khai của tôi và các thư viện đã đọc và đầu ra biên dịch. Có hai điểm khác biệt so với trước đây: META_INF \ MANIFEST.INF hiện được đưa vào bố cục đầu ra một cách rõ ràng và tệp jar dường như được tạo chính xác. :)
grudolf

Điều này không giải quyết được vấn đề, ít nhất là đối với tôi. Tuy nhiên, câu trả lời của jamahn đã hoạt động.
Andrew Breksa

Nhận xét được thêm vào từ người dùng đại diện thấp @ ds-Justice như sau - Nhận xét của @ grudolf ở trên về việc tạo ra một cái Bình trống là điều duy nhất có hiệu quả với tôi sau vài giờ vật lộn với một dự án Gradle đã nhập. Đây là một câu hỏi quan trọng, vui lòng xem xét đăng lại bình luận của bạn như một câu trả lời riêng biệt.
Shawn Mehan

10

Như đã lưu ý trong nhận xét của @ grudolf ở một trong những câu trả lời khác, một cách để thực hiện điều này (và cách duy nhất phù hợp với tôi trong một dự án Gradle đã nhập) là tạo một bình trống như sau:

  • Cấu trúc dự án -> Đồ tạo tác -> + Bình -> Rỗng
  • Ngăn trung tâm hiện có các nút Tạo Tệp kê khai và Sử dụng Tệp kê khai Hiện có. Sử dụng một trong những thứ này.
  • Tôi đã gặp khó khăn nếu tôi trích xuất các thư viện phụ thuộc có tệp kê khai của riêng chúng vào thư mục gốc đầu ra, chúng dường như liên tục ghi đè tệp kê khai mới được tạo theo cách thủ công. Lộn xộn với thứ tự các hoạt động dường như làm cho nó hoạt động.

CẬP NHẬT:

Đây chắc chắn là một lỗi trong Idea. Câu trả lời được liên kết này hoạt động đáng tin cậy khi có các thư mục được trích xuất. Về bản chất, bạn tìm thấy .idea / JARNAME.xml của bạn, thêm thêm các yếu tố sau vào đầu rất của <root>yếu tố cho jar của bạn. Bất kỳ phần tử nào được trích xuất phía trên bản sao tệp mới của bạn có chứa tệp kê khai sẽ che khuất tệp kê khai mới của bạn.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>

7

Nếu bạn muốn chỉ định Lớp chính, bạn phải thêm plugin này vào 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>

1

Tôi đã có một vấn đề tương tự.

Vấn đề là trong tệp pom.xml.

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

Tôi không biết vì lý do gì mã này hoạt động trong nhật thực, nhưng không phải trong IntelliJ

Điều này nó chính xác.

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

Manifest.mf đã hoạt động !!!

Tôi hi vọng cái này giúp được.


Tôi đã gặp tình huống chính xác này và đi đến kết luận giống như bạn đã làm: dòng mới giữa các mục <Phụ thuộc> hoạt động trong Eclipse, nhưng không hoạt động trong Intellij IDEA.
Arion Krause

0

Có một số cách để tạo các lọ thực thi. Sử dụng tính năng GUI của IntelliJ là một cách hay. Một cách khác là sử dụng Maven (hoặc tương tự trong gradle, buildr, v.v.) thân thiện với máy chủ xây dựng:

Nó ít nhiều có thể sao chép từ bản dựng maven ví dụ optaplanner:

  1. Jar của người dùng cuối (ví dụ optaplanner - *. Jar) phải bao gồm classpath của các phụ thuộc trong tệp kê khai của nó .
  2. Tập lệnh sh và bat sau đó phải chạy jar đó với tương ứng.

0

Để không gặp sự cố như Manifest, bạn nên có một thư mục có tên "META-INF" trong thư mục "src". Vì vậy, hãy tạo nó và đặt một tệp có tên "MANIFEST.MF" với nội dung sau:

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

Đừng quên thay thế tên của gói chứa lớp Main ở trên!


4
Hồ sơ cho thấy tôi đã cắt bớt tài liệu tôn giáo khỏi bài đăng của bạn vào tháng Tám. Xin lưu ý rằng cộng đồng đã thảo luận về việc thêm các chủ đề tôn giáo vào các bài đăng, và câu trả lời là chúng tôi muốn chúng bị loại bỏ. Tuy nhiên, bạn được hoan nghênh nhất khi thêm chúng vào hồ sơ hoặc ảnh đại diện của mình.
buộc
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.