Không thể thực thi tệp jar-: Không có thuộc tính tệp kê khai chính


971

Tôi đã cài đặt một ứng dụng, khi tôi cố chạy nó (đó là một tệp thực thi) thì không có gì xảy ra. Khi tôi chạy nó từ dòng lệnh với:

java -jar "app.jar"

Tôi nhận được thông báo sau:

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

Thông thường, nếu tôi đã tự tạo chương trình, tôi sẽ thêm một thuộc tính lớp chính vào tệp kê khai. Nhưng trong trường hợp này, vì tập tin là từ một ứng dụng, tôi không thể làm điều đó. Tôi cũng đã thử trích xuất jar để xem liệu tôi có thể tìm thấy lớp chính hay không, nhưng có nhiều lớp và không ai trong số họ có từ "chính" trong tên của nó. Phải có cách khắc phục điều này vì chương trình chạy tốt trên các hệ thống khác.


Tìm kiếm các phương pháp chính; bạn không thể dựa vào tên lớp.
Dave Newton

2
Tôi biết, nhưng vì tôi chỉ có các tệp. Class nên tôi thực sự không thể nhìn thấy các phương thức. Hay tôi có thể?
Ewoud

Bạn không thực sự gõ dấu ngoặc kép, phải không? Trong mọi trường hợp, có một số cách để xem các phương thức, bao gồm sử dụng javap. Bạn có thể muốn hủy bỏ nó và xem thử nếu thực sự không có bảng kê khai.
Dave Newton

Liên quan: với các phụ thuộc: stackoverflow.com/a/23986765/360211
weston

Điều gì xảy ra nếu tôi không có lớp chính khi tôi đang chạy mã bằng CommandLineJobRunner
Kamini

Câu trả lời:


946

Đầu tiên, thật kỳ lạ khi thấy bạn chạy java -jar "app"và khôngjava -jar app.jar

Thứ hai, để tạo một tệp jar thực thi ... bạn cần phải tạo một tệp có tên META-INF / MANIFEST.MF

bản thân tệp nên có (ít nhất) một lớp lót này:

Main-Class: com.mypackage.MyClass

Trường hợp com.mypackage.MyClasslớp giữ điểm nhập tĩnh static void (String [] args) .

Lưu ý rằng có một số cách để thực hiện việc này với CLI, Maven, Ant hoặc Gradle:

Đối với CLI , lệnh sau sẽ thực hiện: (tks @ dvvrt ) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

Đối với Maven , một cái gì đó như đoạn trích sau nên thực hiện thủ thuật. Lưu ý rằng đây chỉ là định nghĩa plugin, không phải là pom.xml đầy đủ :

<build>
  <plugins>
    <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>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

(Chọn một <version>dự án phù hợp với dự án của bạn.)

Đối với Ant , đoạn trích dưới đây sẽ giúp:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

Tín dụng Michael Niemand -

Đối với Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

15
Trong Ant, <manifest> <tên thuộc tính = "Lớp chính" value = "com.mypackage.MyClass" /> </ manifest> trong phần tử <jar>
Michael Niemand

1
Cảm ơn bạn. Chỉ muốn thêm rằng bạn có thể sao chép các phụ thuộc vào thư mục lib bằng cách này: stackoverflow.com/a/996915/1121497 . Vì classpath bao gồm libthư mục đó nên bạn chỉ cần thực thi jar java -jar myproject.jarvà nó sẽ tìm thấy các phụ thuộc.
Ferran Maylinch

4
LÀM THẾ NÀO ĐỂ "jar một tệp có tên META-INF / MANIFEST.MF"? Tôi có một .jar trên một mặt và một .MF mặt khác, làm thế nào để tôi liên kết chúng lại với nhau? Tôi đặt tệp kê khai trong cùng thư mục với .jar nhưng nó không hoạt động tôi vẫn gặp sự cố!
Wicelo

4
@Wicelo Để chỉ định một tệp MANIFEST.MF cụ thể trong khi tạo tệp jar, hãy sử dụng cờ m cho jar. ví dụ. jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt

1
Lưu ý: Đối với Maven, tôi đã có một maven-jar-pluginmục trong tệp Maven do VSC tạo, vì vậy tôi chỉ cần thêm <configuration>phần vào đó.
Aaron Franke

279

Điều đó nên được java -jar app.jarthay vì java -jar "app".

Các -jarlựa chọn duy nhất hoạt động nếu file JAR là một tập tin JAR thực thi, mà có nghĩa là nó phải có một file manifest với một Main-Classthuộc tính trong đó. Xem Chương trình đóng gói trong Tệp JAR để tìm hiểu cách tạo tệp JAR thực thi.

Nếu đó không phải là JAR thực thi, thì bạn sẽ cần chạy chương trình với nội dung như:

java -cp app.jar com.somepackage.SomeClass

nơi com.somepackage.SomeClasslà lớp chứa các mainphương pháp để chạy chương trình. (Lớp học đó phụ thuộc vào chương trình là gì, không thể nói từ thông tin bạn đã cung cấp).


3
cảm ơn bạn đã trả lời, nhưng giải pháp của bạn chỉ hoạt động nếu tôi biết tên của lớp có chứa phương thức chính. Và đó là một lỗi đánh máy ... Nó được cho là "app.jar". Nhưng làm thế nào để bạn giải thích tại sao nó chạy trên các hệ thống khác bằng cách nhấp đúp vào tệp?
Ewoud

Nếu nó thực sự là một JAR thực thi, bạn có thể trích xuất tệp kê khai (nó nằm trong META-INFthư mục bên trong tệp JAR). Nó nên chứa một Main-Classthuộc tính cung cấp cho bạn tên của lớp chính.
Jesper

Nếu nó không chạy trên một hệ thống, thì hệ thống đó có thể có phiên bản Java quá cũ. Nếu JAR được biên dịch ví dụ với Java 7, thì bạn không thể chạy nó trên một hệ thống có Java 6 trở lên.
Jesper

Điều đó thật buồn cười vì hệ thống khác đang chạy win7 và máy tính này có vấn đề chạy win8.
Ewoud

2
@Jesper Xin chào, nếu nhật thực đang sử dụng gói mặc định thì sao? Tôi chỉ cần đặt tên lớp?
Ogen

127

Ngoài ra, bạn có thể sử dụng maven-assembly-plugin, như trong ví dụ dưới đây:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

Trong ví dụ này, tất cả các lọ phụ thuộc như được chỉ định trong phần sẽ được tự động đưa vào bình duy nhất của bạn. Lưu ý rằng jar-with-phụ thuộc phải được đặt theo nghĩa đen, không được thay thế bằng tên tệp jar bạn muốn đưa vào.


3
Hoàn hảo, điều này làm việc. Nó gói tất cả các phụ thuộc vào một jar, do đó cho phép bạn biên dịch / xây dựng một dự án và chạy nó ra khỏi hộp.
Paul

2
Trong ngữ cảnh của plugin bóng râm , người ta phải làm theo sự trợ giúp tại Executable JAR .
koppor

3
Điều này với maven-assembly-pluginlàm việc. maven-jar-pluginđã không.
Martynas Jusevičius

Lưu ý: đặt mã này vào pom.xmltệp của bạn bên trong <build><plugins> PUT IT HERE </plugins></build>và sau đó thực hiện Gói maven (trong menu trượt maven mở IDEA ở bên phải, tìm gói dự án> Vòng đời> gói). Sau đó, tệp jar của bạn sẽ nằm trong thư mục Target. Chúc mừng!
Kirill Karmazin

Tôi đã thực sự vật lộn với vấn đề này ... Điều này hoạt động hoàn hảo. Cảm ơn!
jmojico

60

Đó là bởi vì Java không thể tìm thấy thuộc tính Main trong tệp MANIFEST.MF. Thuộc tính Main là cần thiết để cho java biết nên sử dụng lớp nào làm điểm vào của ứng dụng. Bên trong tệp jar, tệp MANIFEST.MF nằm trong thư mục META-INF. Tự hỏi làm thế nào bạn có thể nhìn vào những gì bên trong một tệp jar? Mở tệp jar bằng WinRAR.

Thuộc tính chính bên trong MANIFEST.MF trông như thế này:

Main-Class: <packagename>.<classname>

Bạn gặp lỗi "không có thuộc tính bảng kê khai chính" này khi dòng này bị thiếu trong tệp MANIFEST.MF.

Đây thực sự là một mớ hỗn độn rất lớn để chỉ định thuộc tính này trong tệp MANIFEST.MF.

Cập nhật: Tôi vừa tìm thấy một cách thực sự gọn gàng để chỉ định điểm vào của Ứng dụng trong nhật thực. Khi bạn nói Xuất khẩu,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

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


32

Tôi gặp vấn đề tương tự. bằng cách thêm các dòng sau vào tệp pom làm cho nó hoạt động. Plugin sẽ đảm bảo quá trình xây dựng ứng dụng của bạn với tất cả các bước cần thiết.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2
đã hoạt động hoàn hảo, nhưng hãy xem xét thêm phiên bản vào tháng 4 năm 2018 <plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <version> 2.0.1.RELEASE < / phiên bản> </ plugin>
Tenflex

Xin lỗi nhưng đó không phải là giải pháp vì anh ấy không nói về Spring Boot, đó là vấn đề chung với việc thực thi jar :)
LAMRIN TAWSRAS 16/07/18

Cảm ơn rất nhiều, điều này đã giải quyết vấn đề cho mùa xuân khởi động!
AleksandarT

Tôi đang làm việc trên boot mùa xuân 2.2.0. Xin vui lòng. Thật không may, giải pháp này đã không làm việc cho tôi. Tuy nhiên, nó hoạt động khi bạn đã giới thiệu từ một <parent>...</parent>ứng dụng trong pom.xml. Tôi đoán là, nếu chúng ta truy cập parentpom.xml của ứng dụng, chúng ta sẽ có một ý tưởng rõ ràng.
Tusar

Cuối cùng tôi đã giải quyết vấn đề của tôi với các tùy chỉnh repackage-classifier. Vui lòng truy cập docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/ trộm
tusar

30

Câu trả lời của Gradle là thêm cài đặt jar / tệp kê khai / thuộc tính như thế này:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

1
câu trả lời đơn giản nhất cho đến nay.
lasec0203

29

Tôi gặp vấn đề này khi tạo một jar bằng IntelliJ IDEA. Xem cuộc thảo luận này .

Điều giải quyết cho tôi là tạo lại tạo phẩm jar, chọn JAR> Từ các mô-đun có phụ thuộc, nhưng không chấp nhận Danh mục mặc định cho META-INF / MANIFEST.MF. Thay đổi nó từ - / src / main / java thành - / src / main / resource.

Mặt khác, nó bao gồm một tệp kê khai trong tệp jar, nhưng không bao gồm tệp trong - / src / main / java mà nó nên có.


Điều này làm việc cho tôi với IDEA 14.1.6. Tôi cũng đã thêm thuộc tính xây dựng cho pom.xml nhưng nó không có hiệu lực. Nhưng câu trả lời của bạn đã giải quyết nó, cảm ơn bạn.
từ

3
Cảm ơn vì đã cứu máy tính để bàn của tôi khỏi bị móp méo bởi sự thất vọng thuần túy không có gì khác hoạt động;) Liên kết của bạn có vẻ bị hỏng, nhưng tôi có thể xác nhận rằng điều này hoạt động hoàn hảo. Đã thử nghiệm với IntelliJ IDEA 2018.2.5 (Phiên bản cộng đồng)
Matthias Bö

xác nhận rằng điều này hoạt động, mặc dù tôi không có thư mục / resource
lxknvlk

28

Đối với maven, đây là điều đã giải quyết nó (đối với tôi, đối với một cơ sở mã Veetle trên GitHub):

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

Chúc mừng ...


Tôi thấy điều này hoạt động nhưng tôi phải thực thi vì mvn package shade:shadechỉ chạy mvn packagekhông kích hoạt plugin bóng râm để chạy.
Raystorm

24

Hãy thử lệnh này để bao gồm jar:

java -cp yourJarName.jar your.package..your.MainClass

1
Một cách là bao gồm lớp chính trong pom.xml và sử dụng lệnh java -jar, một cách khác là sử dụng lệnh java -cp.
Gaurav Khare

15

Đối với tôi, không có câu trả lời nào thực sự hữu ích - tôi đã có tệp kê khai ở đúng vị trí, chứa Lớp chính và mọi thứ. Điều làm tôi vấp ngã là đây:

Cảnh báo: Tệp văn bản mà bạn đang tạo tệp kê khai phải kết thúc bằng một dòng mới hoặc trả lại vận chuyển. Dòng cuối cùng sẽ không được phân tích cú pháp đúng nếu nó không kết thúc bằng một dòng mới hoặc trả lại vận chuyển.

( nguồn ). Thêm một dòng mới vào cuối bản kê khai đã sửa nó.


11

Nếu sử dụng Maven, bao gồm các mục sau trong pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3
Ai nói đây là một dự án Spring Boot?
james.garriss

2
@ james.garriss Tôi sẽ nói rằng, tôi đã đến bài đăng này để tìm no main manifest attributelỗi nhưng tôi đang làm việc trên ứng dụng khởi động mùa xuân nên câu trả lời này đã giúp tôi. Tôi đã biết cách tạo META-INF/MANIFEST.MFtập tin, nhưng không phải làm thế nào để spring-boot tự động xử lý nó.
Vishrant

5
Tôi không thấy bất kỳ lý do nào để hạ thấp câu trả lời này. Nếu bạn không sử dụng spring-bootchỉ cần bỏ qua nó. Stackoverflow cũng giúp xây dựng kho lưu trữ vấn đề của riêng bạn mà bạn phải đối mặt trong khi lập trình.
Vishrant

@Vishrant Tôi không biết về người khác nhưng tôi đã từ chối vì câu trả lời này không giải quyết được câu hỏi như đã được đặt ra. Nó có thể vừa xảy ra để trả lời câu hỏi của bạn, nhưng câu hỏi của bạn không thực sự là những gì được hỏi.
Bane

@Bane chắc chắn. nhưng câu hỏi có thể được hiểu theo nghĩa rộng và câu trả lời này áp dụng cho nó và có thể giúp người khác hiểu theo nghĩa khi họ sẽ sử dụng boot mùa xuân.
Vishrant

10

Tôi đã có cùng một vấn đề ngày hôm nay. Vấn đề của tôi đã được giải quyết khi chuyển META-INF sang thư mục tài nguyên.


Điều này làm việc cho tôi quá. Hãy dùng thử nếu bạn đang sử dụng Jetbrains IntelliJ
NickSoft

Cảm ơn bạn đã thực sự làm việc cho tôi :)
Syed Mehtab Hassan

Điều này làm việc cho tôi quá trên intellij. Cảm ơn bạn.
Waqas

10

Tôi đã nhận được cùng một lỗi ngay bây giờ. Nếu bạn đang sử dụng gradle, chỉ cần thêm cái tiếp theo trong ur gradle.build:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}

Trường hợp com.company.project.MainClassđường dẫn đến lớp ur với public static void main(String[] args)phương thức.


Điều này đã giúp tôi! hướng dẫn lớp đã chỉ định bằng cách sử dụng bộ mainClassNamebiến cấp cao nhất , nhưng điều đó chỉ giúp với gradle runlệnh chứ không phải với việc tạo một tệp thực thi .jar
kevlarr

8

Vấn đề MAVEN là nó cố gắng bao gồm tệp MANIFEST.MF đầu tiên từ thư viện đầu tiên từ các phụ thuộc thay vì MANIFEST CỦA CHÚNG TÔI.MF KHI BẠN SỬ DỤNG NGHỆ THUẬT! .

  1. Đổi tên yourjar.jar thành yourjar.zip
  2. Mở tệp MANIFEST.MF từ META-INF \ MANIFEST.MF
  3. Sao chép MANIFEST.MF thực sự đã tạo trong dự án của bạn bằng MAVEN Điều đó bao gồm một số thứ giống như sau:

    Manifest-Phiên bản: 1.0 Main-Class: yourpacket.yourmain class (dành cho exmaple info.data.MainClass)

  4. Thay thế nội dung của MANIFEST.MF từ youjar.zip bằng nó.

  5. Đổi tên yourjar.zip thành yourjar.jar trở lại.
  6. Bây giờ java -jar yourjar.jar hoạt động hoàn hảo.

HOẶC LÀ!

Tạo đơn giản bạn sở hữu MANIFEST.MF và:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestFile> Your path like: src/main/resources/META-INF/MANIFEST.MF </manifestFile>
            <index>true</index>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
        </archive>
    </configuration>
</plugin>

Nhưng nếu bạn sử dụng bảng điều khiển maven (hoặc dòng lệnh maven), bạn có thể buộc nó tạo tệp kê khai riêng và đưa nó vào tệp JAR.

  1. Thêm vào phần xây dựng của bạn pom.xml mã này:

    <plugins>
        <plugin>
    
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
    
            <archive>
    
                <index>true</index>
    
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass> yourpacket.yourmainclass (for exmaple info.data.MainClass)</mainClass>
                </manifest>
                <manifestEntries>
                    <mode>development</mode>
                    <url>${project.url}</url>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>

  2. Mở bảng MAVEN (trong Intellij) và thực hiện "Cài đặt". Nó sẽ tạo tệp MANIFEST và biên dịch thuộc tính tệp JAR với tất cả các phụ thuộc vào thư mục "Target". Ngoài ra, nó sẽ được cài đặt vào kho lưu trữ maven cục bộ.



5

Tôi đã đối mặt với cùng một vấn đề và nó đã được sửa ngay bây giờ :) Chỉ cần làm theo các bước dưới đây và lỗi có thể là do bất cứ điều gì, nhưng các bước dưới đây giúp quá trình trơn tru hơn. Tôi dành nhiều thời gian để tìm cách khắc phục.

1. Thử khởi động lại Eclipse (nếu bạn đang sử dụng Eclipse để xây dựng tệp JAR) -> Thực tế điều này đã giúp vấn đề của tôi trong việc xuất tệp JAR đúng cách.

2.Sau khi nhật thực khởi động lại, hãy thử xem nhật thực của bạn có thể nhận ra lớp / phương thức chính bằng dự án Java của bạn không -> nhấp chuột phải -> Chạy dưới dạng -> Chạy cấu hình -> Chính -> nhấp vào nút Tìm kiếm để xem nhật thực của bạn có thể tra cứu lớp chính của bạn trong tệp JAR không. -> Đây là để xác thực rằng tệp JAR sẽ có điểm vào lớp chính.

  1. Sau này, xuất dự án Java Dynamic của bạn dưới dạng tệp "Runnable JAR" chứ không phải tệp JAR.

  2. Trong cấu hình khởi chạy Java, chọn lớp chính của bạn.

  3. Khi xuất tệp jar, sử dụng lệnh bên dưới để thực thi. java -cp [JAR của bạn] .jar [gói hoàn chỉnh] .MainClass, ví dụ: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit. classes.TCRuleAudit

  4. Bạn có thể phải đối mặt với lỗi phiên bản java không được hỗ trợ. Cách khắc phục là thay đổi java_home trong hồ sơ bash shell của bạn để phù hợp với phiên bản java được sử dụng để biên dịch dự án trong nhật thực.

Hi vọng điêu nay co ich! Vui lòng cho tôi biết nếu bạn vẫn có bất kỳ vấn đề.


5

Tôi đã từng gặp vấn đề tương tự. Rất nhiều giải pháp được đề cập ở đây đã không cung cấp cho tôi toàn bộ hình ảnh, vì vậy tôi sẽ cố gắng cung cấp cho bạn một bản tóm tắt về cách đóng gói các tệp jar từ dòng lệnh .

  1. Nếu bạn muốn có các .classtệp của mình trong các gói, hãy thêm gói vào đầu .java.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. Để biên dịch mã của bạn với các .classtệp của bạn kết thúc với cấu trúc được cung cấp bởi tên gói, hãy sử dụng:

    javac -d . Test.java

    Các -d .làm cho trình biên dịch tạo ra các cấu trúc thư mục bạn muốn.

  3. Khi đóng gói .jartập tin, bạn cần hướng dẫn thói quen jar về cách đóng gói. Ở đây chúng tôi sử dụng các tùy chọn thiết lập cvfeP. Điều này là để giữ cấu trúc gói (tùy chọn P), chỉ định điểm vào để tệp kê khai chứa thông tin có ý nghĩa (tùy chọn e). Tùy chọn fcho phép bạn chỉ định tên tệp, tùy chọn ctạo tệp lưu trữ và tùy chọn vđặt đầu ra thành dài dòng. Những điều quan trọng cần lưu ý ở đây là Pe.

    Sau đó đến tên của lọ chúng tôi muốn test.jar.

    Sau đó đến điểm vào.

    Và sau đó đến -C . <packagename>/để lấy các tệp lớp từ thư mục đó, bảo toàn cấu trúc thư mục.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. Kiểm tra .jartập tin của bạn trong một chương trình zip. Nó nên có cấu trúc như sau

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class

    MANIFEST.MF nên chứa các mục sau

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test

    Nếu bạn chỉnh sửa bảng kê khai của mình bằng tay, hãy chắc chắn giữ dòng mới ở cuối nếu không java không nhận ra nó.

  5. Thực hiện .jartập tin của bạn với

    java -jar test.jar

1
Bước 4 của câu trả lời của bạn là rất quan trọng! Bản kê khai của tôi không hoạt động vì dòng mới đó cuối cùng tôi không biết tôi phải đặt. Tất cả các câu trả lời tôi đã truy cập về chủ đề này (rất nhiều) đã không đề cập đến vấn đề này và bắt buộc đối với bất kỳ ai không sử dụng maven, ant, gradle, v.v.
Maude

1
@Maude cảm ơn bạn đã phản hồi. Đó chính xác là lý do tại sao tôi thêm câu trả lời với gợi ý dòng chữ in đậm . Tôi đã tìm kiếm nhiều ngày cho đến khi tôi phát hiện ra điều này bằng cách so sánh với một bảng kê khai được tạo tự động.
CodeMonkey

Hah, cảm ơn Tôi chỉ đang đập đầu vào thứ mới đó.
Richard Thomas

5

Cá nhân tôi nghĩ rằng tất cả các câu trả lời ở đây là hiểu sai câu hỏi. Câu trả lời cho điều này nằm ở sự khác biệt về cách spring-boot xây dựng .jar. Ai cũng biết rằng bộ mùa xuân Boot lên một biểu hiện như thế này, mà thay đổi từ everyones asssumption rằng đây là một khởi .jar tiêu chuẩn, mà nó có thể hoặc không có thể là:

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

Có lẽ nó cần phải được thực hiện với org.springframework.boot.loader.JarLaunchertrên đường dẫn?


Điều này nghe có vẻ hứa hẹn. Làm thế nào chính xác để bạn thêm JarLauncher vào classpath?
MarkHu

4

Bất kỳ tệp jar thực thi nào cũng nên chạy bằng cách nhấp hoặc chạy bằng dấu nhắc lệnh như java -jar app.jar (sử dụng "if path of jar chứa dấu cách" - tức là java -jar "C: \ tên thư mục \ app.jar"). Nếu jar thực thi của bạn không chạy, có nghĩa là nó không được tạo đúng.

Để hiểu rõ hơn, hãy giải nén tệp jar (hoặc xem bằng bất kỳ công cụ nào, đối với windows 7-Zip là một tệp đẹp) và kiểm tra tệp trong /META-INF/MANIFEST.MF. Nếu bạn tìm thấy bất kỳ mục như

Lớp chính: your.package.name.ClaaswithMain - vậy thì tốt, nếu không bạn phải cung cấp nó.

Lưu ý về việc nối thêm mục Main-Class trên tệp MANIFEST.MF, kiểm tra xem bạn đang lưu nó ở đâu!


4

Bạn có thể chỉ cần làm theo bước này Tạo một tệp jar bằng cách sử dụng

 jar -cfm jarfile-name manifest-filename Class-file name

Trong khi chạy tệp jar, chạy đơn giản như thế này

 java -cp jarfile-name main-classname

4

Bạn có thể không tạo đúng tệp jar:

ví dụ: thiếu tùy chọn m trong tạo jar

Các công việc sau đây:

jar -cvfm MyJar.jar Manifest.txt *.class

4

Nếu bạn đang sử dụng dòng lệnh để lắp ráp .jar, có thể trỏ đến chính mà không cần thêm tệp Manifest. Thí dụ:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(param "e" thực hiện điều đó: TheNameOfClassWithMainMethod là tên của lớp với phương thức main () và app.jar - tên của tệp thực thi .jar và *. class - chỉ tất cả các tệp lớp để lắp ráp)


3

Đối với tôi, lỗi này xảy ra đơn giản vì tôi đã quên nói với Eclipse rằng tôi muốn có một tệp jar có thể chạy được chứ không phải là một tệp jar thư viện đơn giản. Vì vậy, khi bạn tạo tệp jar trong Eclipse, hãy đảm bảo rằng bạn nhấp vào nút radio bên phải


3

Các câu trả lời trên chỉ là một phần hữu ích cho tôi. java -cplà một phần của câu trả lời, nhưng tôi cần thông tin cụ thể hơn về cách xác định lớp để chạy. Đây là những gì làm việc cho tôi:

Bước 1: tìm lớp tôi cần chạy

jar tf /path/to/myjar.jar | more

Các dòng trên cùng của kết quả là:

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

App. Class chứa lớp chính để chạy. Tôi không chắc chắn 100% nếu bạn luôn có thể cho rằng lớp bạn cần là lớp đầu tiên, nhưng nó là dành cho tôi. Nếu không, tôi sẽ tưởng tượng rằng không quá khó để sử dụng grep để loại trừ các kết quả liên quan đến thư viện để giảm danh sách lớp xuống kích thước có thể quản lý được.

Từ đó thật dễ dàng: Tôi chỉ sử dụng đường dẫn đó (trừ hậu tố ". Class"):

java -cp /path/to/myjar.jar somepath/App

Nó không phải luôn luôn là lớp học đầu tiên. Hầu như không bao giờ. Dòng lệnh nên được java -cp ... somepackage.App.
Hầu tước Lorne

2

Vì bạn đã thêm MANIFEST.MF, tôi nghĩ bạn nên xem xét thứ tự của Trường trong tệp này. Env của tôi là java version "1.8.0_91"

và MANIFEST.MF của tôi ở đây

// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing

// run
~ java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar

Tuy nhiên, điều này như dưới đây chạy qua

Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)

//this run swing normally

Hở? Thứ tự là không quan trọng. Không rõ những gì bạn đang tuyên bố.
Hầu tước Lorne

2

(bài đầu tiên - vì vậy nó có thể không sạch sẽ)

Đây là bản sửa lỗi của tôi cho OS X 11.6, chương trình Netbeans 8.2 dựa trên Maven. Cho đến nay, ứng dụng của tôi là 100% Netbeans - không điều chỉnh (chỉ cần một vài thoát vỏ là không thể!).

Đã thử hầu hết tất cả các câu trả lời ở đây và những nơi khác nhưng không có kết quả, tôi trở lại với nghệ thuật "sử dụng những gì hiệu quả".

Câu trả lời hàng đầu ở đây ( olivier-refalo thanx) có vẻ như là nơi thích hợp để bắt đầu nhưng không giúp được gì.

Nhìn vào các dự án khác đã làm việc, tôi nhận thấy một số khác biệt nhỏ trong các dòng kê khai:

  1. addClasspath, classpathPrefix không có (đã xóa chúng)
  2. mainClass bị thiếu "com." (đã sử dụng NB -> Thuộc tính dự án-> Chạy-> Lớp chính-> Duyệt để chỉ định)

Không chắc tại sao (tôi chỉ 3 tháng vào java) hoặc làm thế nào, nhưng chỉ có thể nói điều này hoạt động.

Đây chỉ là khối kê khai được sửa đổi được sử dụng:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>

2

Tôi tìm thấy một giải pháp mới cho thế hệ biểu hiện xấu!

  1. Mở tệp jar bằng trình chỉnh sửa zip như WinRAR
  2. Bấm vào để META-INF

  3. Thêm hoặc chỉnh sửa

    • Thêm vào:

      • Tạo một tệp văn bản có tên MANIFEST.MF trong một thư mục có tên META-INF và thêm dòng sau:

        • Bản kê khai-Phiên bản: 1.0
        • Lớp chính: gói.ex.com.view.mainClassName
      • Lưu tệp và thêm nó vào zip

    • Biên tập:

      • Kéo tệp ra sửa đổi MANIFEST.MF để thêm dòng trước đó
  4. Mở cmd và gõ: java -jar c: /path/JarName.jar

Nó sẽ hoạt động tốt bây giờ!


2

Hầu hết các giải pháp không hiệu quả với tôi nhưng người hướng dẫn của tôi đã giúp tôi, tôi muốn chia sẻ giải pháp của anh ấy ở đây, tôi đã sử dụng thiết bị đầu cuối kali linux nhưng sẽ ổn trong tất cả các debian

javac *.java
nano MANIFEST.MF

trong loại tập tin

Main-Class: Main hoặc bất kể tên tệp chính của bạn là gì (đảm bảo thêm tên gói nếu nó tồn tại)

jar -cvmf MANIFEST.MF new.jar *.class

Bây giờ để chạy tập tin sử dụng

java -jar new.jar

hoặc bạn có thể đến propeties của tập tin và kiểm tra

Cho phép thực thi tập tin như chương trình

nhấp đúp chuột vào nó

nó đã giúp tôi trong khi hầu hết các câu trả lời trên không


1

Bạn có thể có cùng một vấn đề như tôi. Sau khi tạo tập tin .jar của bạn, hãy viết jar xf app.jar META-INF/MANIFEST.MF. Điều này sẽ tạo một bản sao của tập tin vào thư mục hiện tại của bạn để bạn có thể đọc nó. Nếu nó chỉ nói một cái gì đó như:

Bản kê khai-Phiên bản: 1.0

Được tạo bởi: 1.8.0_51 (Tập đoàn Oracle)

và không chứa khai báo "Main-Class", sau đó tôi nghĩ bạn đã tìm thấy vấn đề của mình.

Tôi không biết làm thế nào để giải quyết nó, mặc dù. Tôi đã kiểm tra những người khác có vấn đề tương tự / tương tự trên StackOverflow và không thể tìm thấy câu trả lời. Tuy nhiên với thông tin này, có lẽ bạn có thể nhận được sự giúp đỡ tốt hơn (thực tế là bạn có cùng vấn đề với tôi).

Chỉnh sửa: Tôi đã thử với tệp kê khai nhưng không làm cho nó hoạt động, nhưng lỗi của tôi là chỉ đặt tên cho một trong các lớp khi tạo tệp jar. Tôi đã viết *. Class thay vào đó và nó hoạt động ngay bây giờ.

Mặc dù tôi không biết tại sao cần phải tạo tệp kê khai. Nhưng tôi đoán nó vẫn ổn miễn là nó hoạt động.


1

Tôi đã gặp vấn đề này và tôi đã giải quyết nó gần đây bằng cách thực hiện điều này trong Netbeans 8 (Tham khảo hình ảnh bên dưới):

Thuộc tính dự án Netbeans

  1. đi đến tài sản của dự án của bạn.
  2. bấm vào Chạy .
  3. chỉ định lớp chính của dự án của bạn bằng trình duyệt .
  4. xây dựngchạy tệp Jar.
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.