jar 파일을 실행할 수 없습니다 : "주요 매니페스트 속성 없음"


970

응용 프로그램을 설치하려고했는데 응용 프로그램을 실행하려고하면 실행 파일이 아닙니다. 명령 줄에서 다음을 사용하여 실행할 때 :

java -jar "app.jar"

다음과 같은 메시지가 나타납니다.

"app.jar"에 주요 매니페스트 속성이 없습니다.

일반적으로 프로그램을 직접 만든 경우 매니페스트 파일에 기본 클래스 특성을 추가했을 것입니다. 그러나이 경우 파일은 응용 프로그램의 파일이므로 그렇게 할 수 없습니다. 또한 주 클래스를 찾을 수 있는지 확인하기 위해 항아리를 추출하려고 시도했지만 많은 클래스가 있으며 그중 누구도 이름에 "main"이라는 단어가 없습니다. 프로그램이 다른 시스템에서 제대로 실행되기 때문에이 문제를 해결하는 방법이 있어야합니다.


주요 방법을 찾으십시오. 수업 명에 의존 할 수 없습니다.
Dave Newton

2
나는 알고 있지만 .class 파일 만 가지고 있기 때문에 실제로 메소드를 볼 수 없습니다. 아니면 할 수 있습니까?
Ewoud

당신은 실제로 따옴표를 입력하지 않습니다, 당신은? 어쨌든 메소드를 보는 방법에는 여러 가지가 있습니다 javap. 당신은 그것을 해제하고 실제로 매니페스트가 없는지보고 싶을 수도 있습니다.
Dave Newton


CommandLineJobRunner
Kamini

답변:


946

첫째, 어떤 이상한의, 당신이 실행 볼 수 java -jar "app"하지java -jar app.jar

둘째, jar 실행 파일을 만들려면 META-INF / MANIFEST.MF라는 파일을 jar로 만들어야합니다.

파일 자체에는 적어도 하나의 라이너가 있어야합니다.

Main-Class: com.mypackage.MyClass

공개 정적 void main (String [] args) 진입 점을 com.mypackage.MyClass보유하는 클래스는 어디에 있습니까 ?

CLI, Maven, Ant 또는 Gradle을 사용하여 여러 가지 방법으로이를 수행 할 수 있습니다.

내용은 CLI , 다음 명령이 어떤 작업을 수행 : (TKS @ dvvrt ) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

들어 메이븐 , 다음 코드 같은 트릭을 할해야합니다. 이것은 전체 pom.xml 이 아니라 플러그인 정의 일뿐입니다 .

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

( <version>프로젝트에 적절한 것을 골라라 .)

를 들어 개미 의 도움이 있어야 아래 니펫을 :

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

크레딧 : Michael Niemand-

대한 Gradle을 :

plugins {
    id 'java'
}

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

15
Ant의 <manifest> <attribute name = "Main-Class"value = "com.mypackage.MyClass"/> </ manifest> <jar> 요소
Michael Niemand

1
감사합니다. stackoverflow.com/a/996915/1121497을 사용하여 종속성을 lib 폴더에 복사 할 수 있다고 추가하고 싶었습니다 . 클래스 경로에 해당 lib폴더가 포함되어 있으므로 jar를 실행하기 만하면 java -jar myproject.jar종속 항목을 찾을 수 있습니다.
페란 Maylinch

4
"META-INF / MANIFEST.MF"파일을 여는 방법? 한 손에 .jar이 있고 다른 손에 .MF가 있는데 어떻게 연결합니까? .jar과 동일한 폴더에 매니페스트를 넣었지만 작동하지 않지만 여전히 문제가 있습니다!
Wicelo

4
@Wicelo jar 파일을 작성하는 동안 특정 MANIFEST.MF 파일을 지정하려면 jar에 m 플래그를 사용하십시오 . 예. jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt

1
참고 : Maven의 경우 이미 maven-jar-pluginVSC 생성 Maven 파일에 항목이 있으므로 <configuration>섹션을 추가 했습니다.
Aaron Franke

279

java -jar app.jar대신에 있었을 것입니다 java -jar "app".

-jar옵션은 JAR 파일이 실행 가능한 JAR 파일 인 경우에만 작동합니다. 즉, Main-Class속성 이있는 Manifest 파일이 있어야 합니다. 실행 가능한 JAR 작성 방법을 배우려면 JAR 파일의 프로그램 패키징을 참조하십시오 .

실행 가능한 JAR이 아닌 경우 다음과 같이 프로그램을 실행해야합니다.

java -cp app.jar com.somepackage.SomeClass

프로그램을 실행하는 메소드 com.somepackage.SomeClass가 들어있는 클래스는 어디에 있습니까 main? (이 클래스는 프로그램에 따라 다르므로 제공 한 정보로는 말할 수 없습니다).


3
답장을 보내 주셔서 감사하지만 솔루션은 기본 메소드가 포함 된 클래스 이름을 알고있는 경우에만 작동합니다. 그리고 그것은 오타였습니다 ... "app.jar"이어야 했어요. 그러나 파일을 두 번 클릭하여 다른 시스템에서 실행되는 이유를 어떻게 설명합니까?
Ewoud

실제로 실행 가능한 JAR 인 경우 Manifest 파일 ( META-INFJAR 파일 의 디렉토리에 있음)을 추출 할 수 있습니다 . Main-Class메인 클래스의 이름을 제공 하는 속성을 포함해야합니다 .
Jesper

하나의 시스템에서 실행되는 경우 해당 시스템의 Java 버전이 너무 오래된 것 같습니다. JAR이 예를 들어 Java 7로 컴파일 된 경우 Java 6 이상이있는 시스템에서 실행할 수 없습니다.
Jesper

다른 시스템이 win7을 실행하고 문제가있는이 PC가 win8을 실행하기 때문에 재미 있습니다.
Ewoud

2
@Jesper 안녕하세요, 이클립스가 기본 패키지를 사용하고 있다면 어떨까요? 수업 명을 넣을까요?
Ogen

127

또는 아래 예제와 같이 maven-assembly-plugin을 사용할 수 있습니다.

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

이 예제에서 섹션에 지정된 모든 종속 jar은 단일 jar에 자동으로 포함됩니다. jar-with-dependencies는 포함하려는 jar 파일 이름으로 바꾸지 말고 그대로 그대로 두어야합니다.


3
완벽합니다. 모든 의존성을 하나의 항아리에 묶어서 프로젝트를 컴파일 / 빌드하고 즉시 실행할 수 있습니다.
Paul

2
쉐도우 플러그인 의 맥락 에서 Executable JAR 의 도움을 따라야한다 .
koppor

3
이것과 함께 maven-assembly-plugin했습니다. maven-jar-plugin하지 않았다.
Martynas Jusevičius

참고 :이 코드를 pom.xml파일 에 넣고 <build><plugins> PUT IT HERE </plugins></build>maven Package를 실행하십시오 (오른쪽의 IDEA 열린 maven 슬라이딩 메뉴에서 프로젝트> 라이프 사이클> 패키지를 찾으십시오). 그런 다음 jar 파일은 대상 폴더에 있습니다. 건배!
Kirill Karmazin

나는이 문제로 정말로 고투하고 있었다 ... 이것은 완벽하게 작동한다. 감사!
jmojico

60

Java가 MANIFEST.MF 파일에서 Main 속성을 찾을 수 없기 때문입니다. Main 속성은 java에게 응용 프로그램의 진입 점으로 사용해야 할 클래스를 알려주는 데 필요합니다. jar 파일 내에서 MANIFEST.MF 파일은 META-INF 폴더에 있습니다. jar 파일의 내용을 어떻게 볼 수 있는지 궁금하십니까? WinRAR로 jar 파일을여십시오.

MANIFEST.MF 내부의 주요 속성은 다음과 같습니다.

Main-Class: <packagename>.<classname>

이 줄이 MANIFEST.MF 파일에서 누락되면이 "기본 매니페스트 속성 없음"오류가 발생합니다.

MANIFEST.MF 파일 내에이 속성을 지정하는 것은 정말 엉망입니다.

업데이트 : 방금 응용 프로그램의 진입 점을 식으로 지정하는 정말 깔끔한 방법을 찾았습니다. 내보내기라고하면

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.

여기에 이미지 설명을 입력하십시오


32

나는 같은 문제가 있었다. pom 파일에 다음 줄을 추가하면 작동합니다. 플러그인은 필요한 모든 단계를 통해 애플리케이션의 빌드 프로세스를 확인합니다.

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

2
완벽하게 작동했지만 2018 년 4 월 <plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <version> 2.0.1.RELEASE < / version> </ plugin>
Tenflex

죄송하지만 스프링 부트에 대해 이야기하지 않기 때문에 해결책이 아닙니다. jar 실행의 일반적인 문제입니다. :)
LAMRIN TAWSRAS

고마워요, 이것은 스프링 부트 문제를 해결했습니다!
AleksandarT

스프링 부트 2.2.0에서 릴리스 중입니다. 불행히도이 솔루션은 저에게 효과적이지 않았습니다. 그러나 <parent>...</parent>pom.xml 의 응용 프로그램에서 참조했을 때 작동합니다 . 내 생각에, parent응용 프로그램의 pom.xml을 방문하면 명확한 아이디어를 얻을 수 있습니다.
tusar

나는 마침내 custom 문제를 해결했다 repackage-classifier. docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…을
tusar

30

Gradle의 대답은 다음과 같이 jar / manifest / attributes 설정을 추가하는 것입니다.

apply plugin: 'java'

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

1
지금까지 가장 간단한 대답.
lasec0203

29

IntelliJ IDEA를 사용하여 항아리를 만들 때이 문제가 발생했습니다. 이 토론을 참조하십시오 .

나를 위해 해결 한 것은 jar 이슈를 다시 작성하여 JAR> 종속성이있는 모듈에서를 선택했지만 META-INF / MANIFEST.MF의 기본 디렉토리는 허용하지 않았습니다. -/ src / main / java에서-/ src / main / resources로 변경하십시오.

그렇지 않으면 jar에 매니페스트 파일이 포함되었지만-/ src / main / java에는 없어야합니다.


이것은 IDEA 14.1.6에서 나를 위해 일했습니다. 또한 pom.xml의 빌드 속성을 추가했지만 아무런 효과가 없었습니다. 그러나 당신의 대답은 그것을 해결했습니다. 감사합니다.
lsrom

3
아무것도 작동하지 않는 순수한 좌절감으로 인해 데스크탑이 손상되지 않도록 저장해 주셔서 감사합니다. IntelliJ IDEA 2018.2.5 (커뮤니티 에디션)에서 테스트
Matthias Bö

/ resources 디렉토리가 없어도 이것이 작동 함을 확인했습니다
lxknvlk

28

maven의 경우 이것이 해결되었습니다 (GitHub의 Veetle 코드베이스의 경우).

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

건배...


나는 이것이 효과가 있음을 알았지 mvn package shade:shade만 실행 mvn package하면 음영 플러그인이 실행되지 않았으므로 실행해야했습니다.
Raystorm

24

jar를 포함 시키려면이 명령을 시도하십시오.

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

1
한 가지 방법은 pom.xml에 기본 클래스를 포함시키고 java -jar 명령을 사용하는 것이고 다른 방법은 java -cp 명령을 사용하는 것입니다.
Gaurav Khare 2016 년

15

나에게 도움이되는 답변은 없었습니다. 메인 클래스와 모든 것을 포함하는 매니페스트 파일이 올바른 위치에있었습니다. 나를 넘어 뜨린 것은 이것이었다.

경고 : 매니페스트를 만들려는 텍스트 파일은 줄 바꿈 또는 캐리지 리턴으로 끝나야합니다. 마지막 줄은 줄 바꿈이나 캐리지 리턴으로 끝나지 않으면 제대로 구문 분석되지 않습니다.

( 소스 ). 매니페스트 끝에 줄 바꿈을 추가하면 수정되었습니다.


11

Maven을 사용하는 경우 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
이것이 스프링 부트 프로젝트라고 누가 말했습니까?
james.garriss

2
@ james.garriss 잘 말할 것입니다.이 게시물에 no main manifest attribute오류를 찾아 왔지만 스프링 부트 응용 프로그램을 작성 중이므로이 답변이 도움이되었습니다. 나는 META-INF/MANIFEST.MF파일 을 만드는 방법을 이미 알고 있었지만 스프링 부트가 자동으로 파일을 처리 하는 방법을 알지 못했습니다.
슈트

5
이 답변을 내리는 이유는 없습니다. 사용하지 않는 경우 spring-boot무시하십시오. Stackoverflow는 프로그래밍하는 동안 직면하는 자체 문제 저장소를 빌드하는 데 도움이됩니다.
슈트

@Vishrant 나는 다른 사람들에 대해 알지 못하지만이 답변은 제기 된 질문을 다루지 않기 때문에 다운 투표했습니다. 귀하의 질문에 대한 답변 이 방금 발생 했을 수도 있지만 귀하의 질문은 실제로 요청 된 것이 아닙니다.
Bane

@ 베인. 그러나이 질문은 광범위한 의미로 받아 들여질 수 있으며이 답변은 그에 적용되며 다른 사람들이 스프링 부트를 사용할 때 도움이 될 수 있습니다.
Vishrant

10

오늘도 같은 문제가있었습니다. 내 문제는 META-INF를 resources 폴더로 옮기는 중 해결되었습니다.


이것은 나에게도 효과가있었습니다. 당신이 JetBrains의 IntelliJ를 사용하는 경우 그것을 시도
NickSoft

정말 나를 위해 일해 주셔서 감사합니다 :)
Syed Mehtab Hassan

이것은 intellij에서도 저에게 효과적이었습니다. 고마워요.
와카 스

10

지금 막 같은 오류가 발생했습니다. 를 사용하는 경우 gradleur에 다음을 추가하십시오 gradle.build.

apply plugin: 'java'

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

어디 com.company.project.MainClass와 UR 클래스 경로 public static void main(String[] args)방법.


이것은 나를 도왔다! gradle 튜토리얼은 최상위 mainClassName변수 세트를 사용하여 지정 했지만 gradle run실행 가능한 .jar를 만드는 것이 아니라 명령 에만 도움이됩니다.
kevlarr

8

MAVEN 문제는 ARTIFACTS를 사용할 때 OWN MANIFEST.MF 대신 종속성의 첫 번째 라이브러리에서 첫 번째 MANIFEST.MF 파일을 포함시키려는 시도입니다 ! .

  1. yourjar.jar의 이름을 yourjar.zip으로 바꾸십시오.
  2. META-INF \ MANIFEST.MF에서 MANIFEST.MF 파일을 엽니 다.
  3. MAVEN에 의해 ​​프로젝트에서 이미 생성 된 실제 MANIFEST.MF를 복사하십시오.

    매니페스트 버전 : 1.0 메인 클래스 : yourpacket.yourmainclass (예 : info.data.MainClass의 경우)

  4. youjar.zip의 MANIFEST.MF 컨텐츠를 해당 컨텐츠로 바꾸십시오.

  5. yourjar.zip의 이름을 yourjar.jar로 다시 바꾸십시오.
  6. 이제 java -jar yourjar.jar이 완벽하게 작동합니다.

또는!

간단하게 MANIFEST.MF를 소유하고 다음을 수행하십시오.

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

그러나 maven 패널 (또는 maven 명령 행)을 사용하면 자체 매니페스트를 생성하여 JAR 파일에 포함시킬 수 있습니다.

  1. 이 pom.xml의 빌드 섹션에 다음 코드를 추가하십시오.

    <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. MAVEN 패널 (Intellij에서)을 열고 "설치"를 실행하십시오. MANIFEST 파일을 생성하고 JAR 파일을 모든 종속성이있는 "Target"폴더로 컴파일합니다. 또한 로컬 메이븐 리포지토리에 설치됩니다.



5

나는 똑같은 문제에 직면했고 지금 수정되었습니다.) 아래 단계를 따르십시오. 오류는 무엇이든 가능하지만 아래 단계는 프로세스를 더 매끄럽게 만듭니다. 나는 해결책을 찾기 위해 많은 시간을 소비한다.

1. Eclipse를 다시 시작하십시오 (Eclipse를 사용하여 JAR 파일을 작성하는 경우)-> 실제로 이것은 JAR 파일을 올바르게 내보내는 데 도움이되었습니다.

2. 일식을 다시 시작한 후 일식이 Java 프로젝트에서 주 클래스 / 방법을 인식 할 수 있는지 확인하십시오-> 마우스 오른쪽 단추 클릭-> 다음으로 실행-> 구성 실행-> 기본-> 검색 단추 클릭 이클립스가 JAR 파일에서 메인 클래스를 검색 할 수 있는지 확인하십시오. -> JAR 파일이 메인 클래스의 엔트리 포인트를 가지는지 검증하기위한 것입니다.

  1. 그런 다음 Java Dynamic 프로젝트를 JAR 파일이 아닌 "실행 가능한 JAR"파일로 내보내십시오.

  2. Java 실행 구성에서 기본 클래스를 선택하십시오.

  3. jar 파일을 내 보내면 아래 명령을 사용하여 실행하십시오. java -cp [Your JAR] .jar [완전한 패키지] .MainClass 예 : java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. 지원되지 않는 Java 버전 오류가 발생할 수 있습니다. 이 문제는 쉘 bash 프로파일의 java_home을 Eclipse에서 프로젝트를 컴파일하는 데 사용되는 Java 버전과 일치하도록 변경하는 것입니다.

도움이 되었기를 바랍니다! 여전히 문제가 있으면 알려주세요.


5

나는 같은 문제가 있었다. 여기에 언급 된 많은 솔루션이 전체 그림을 제공하지는 않았으므로 명령 줄에서 jar 파일을 압축 하는 방법에 대한 요약을 제공하려고합니다 .

  1. 당신은 당신이 원하는 경우 .class패키지 파일의 시작 부분에 패키지를 추가합니다 .java.

    테스트

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. .class패키지 이름으로 주어진 구조로 끝나는 파일로 코드를 컴파일하려면 다음을 사용하십시오.

    javac -d . Test.java

    -d .컴파일러가 원하는 디렉토리 구조를 만들 수 있습니다.

  3. .jar파일을 패키징 할 때 , jar 루틴에 패키징 방법을 지시해야합니다. 여기서는 set 옵션을 사용합니다 cvfeP. 이는 패키지 구조 (옵션 P) 를 유지하고 매니페스트 파일에 의미있는 정보 (옵션 ) 가 포함되도록 진입 점을 지정하는 것e 입니다. 옵션을 f사용하면 파일 이름을 지정할 수 있으며, 옵션 c은 아카이브를 만들고 옵션 v은 출력을 상세하게 설정합니다. 여기서주의해야 할 것은 Pe입니다.

    우리가 원하는 항아리의 이름이 온다 test.jar.

    그런 다음 진입 점이 온다.

    그런 다음 -C . <packagename>/폴더 구조를 유지하면서 해당 폴더에서 클래스 파일을 가져 옵니다 .

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. .jarzip 프로그램에서 파일을 확인하십시오 . 다음과 같은 구조를 가져야합니다

    test.jar

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

    MANIFEST.MF에는 다음이 포함되어야합니다.

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

    직접 매니페스트를 편집 하는 경우 줄 바꿈을 마지막에 유지해야 합니다. 그렇지 않으면 java가 인식하지 못합니다.

  5. .jar파일을 실행하여

    java -jar test.jar

1
답의 네 번째 단계는 매우 중요합니다! 마지막에 줄 바꿈으로 인해 내 매니페스트가 작동하지 않았습니다. 내가이 주제 (많은)를 방문한 모든 답변은 이것을 언급하지 않았으며, maven, ant, gradle 등을 사용하지 않는 사람에게는 필수적입니다.
Maude

1
@Maude 의견에 감사드립니다. 이것이 바로 개행 힌트가 굵게 표시된 답변을 추가 한 이유 입니다. 자동 생성 된 매니페스트와 비교 하여이 사실을 알 때까지 며칠을 보았습니다.
CodeMonkey

고마워 난 그냥 그 개행에 내 머리를 두드리고 있었다.
리처드 토마스

5

나는 개인적으로 여기의 모든 대답이 질문을 잘못 이해하고 있다고 생각합니다. 이에 대한 대답은 spring-boot가 .jar을 빌드하는 방법의 차이에 있습니다. 모두가 알고있는 그 모든 사람의에서 변화하는이 같은 매니페스트까지 봄 부팅 세트 asssumption 이 그것 또는하지 않을 수 있습니다 표준의 .jar 발사이라고 :

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

아마도 org.springframework.boot.loader.JarLauncher클래스 패스 에서 실행해야 합니까?


유망한 소리. JarLauncher를 클래스 경로에 정확히 어떻게 추가합니까?
MarkHu

4

실행 가능한 jar 파일 java -jar app.jar와 같은 명령 프롬프트를 사용하여 클릭하거나 실행하여 실행해야합니다 ( "jar의 경로에 공간이있는 경우"(예 : java -jar "C : \ folder name \ app.jar")). 실행 가능한 jar이 실행되고 있지 않으면 제대로 작성되지 않은 것입니다.

더 나은 이해를 위해 jar 파일을 추출하거나 Windows 7-Zip이 좋은 도구 인 경우 도구를 사용하여 /META-INF/MANIFEST.MF에서 파일을 확인하십시오. 다음과 같은 항목을 찾으면

메인 클래스 : your.package.name.ClaaswithMain-괜찮습니다. 그렇지 않으면 제공해야합니다.

MANIFEST.MF 파일에 Main-Class 항목을 추가하는 것을 알고 저장 위치를 ​​확인하십시오!


4

이 단계를 수행하면됩니다.

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

jar 파일을 실행하는 동안 다음과 같이 간단하게 실행하십시오.

 java -cp jarfile-name main-classname

4

jar 파일을 올바르게 작성하지 않았을 수 있습니다.

예 : jar 생성시 누락 된 옵션 m

다음과 같이 작동합니다.

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

4

명령 행을 사용하여 .jar을 어셈블하는 경우 Manifest 파일을 추가하지 않고 주를 가리킬 수 있습니다. 예:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

( "e"매개 변수는 다음을 수행합니다. TheNameOfClassWithMainMethod는 메소드 main () 및 app.jar-실행 파일 이름 .jar 및 * .class-조립할 모든 클래스 파일 만있는 클래스 이름입니다)


3

나 에게이 오류는 Eclipse에 간단한 라이브러리 jar 파일이 아닌 실행 가능한 jar 파일을 원한다는 것을 잊어 버렸기 때문에 발생했습니다. 따라서 Eclipse에서 jar 파일을 작성할 때 오른쪽 단일 선택 단추를 클릭하십시오.


3

위의 답변은 나에게 부분적으로 도움이되었습니다. java -cp대답의 일부 였지만 실행할 클래스를 식별하는 방법에 대한 자세한 정보가 필요했습니다. 다음은 나를 위해 일한 것입니다.

1 단계 : 실행해야하는 수업 찾기

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

결과의 맨 위 줄은 다음과 같습니다.

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

App.class에는 실행할 기본 클래스가 포함되어 있습니다. 필요한 클래스가 항상 첫 번째 클래스라고 가정 할 수 있는지 100 % 확신하지 못하지만 그것은 나에게 적합했습니다. 그렇지 않은 경우 grep을 사용하여 라이브러리 관련 결과를 제외하여 클래스 목록을 관리 가능한 크기로 줄이기가 너무 어렵지 않다고 생각합니다.

거기에서 그것은 쉬웠다 : 나는 단지 그 경로를 사용한다 ( ".class"접미사 빼기) :

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

항상 첫 번째 수업은 아닙니다. 거의. 명령 줄은이어야합니다 java -cp ... somepackage.App.
user207421

2

MANIFEST.MF를 추가 했으므로이 파일에서 Field의 순서를 고려해야한다고 생각합니다. 내 환경은 java version "1.8.0_91"

여기 내 MANIFEST.MF

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

그러나 이것은 아래와 같이 실행됩니다.

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

//this run swing normally

뭐라고? 순서는 중요하지 않습니다. 무엇을 주장하고 있는지 명확하지 않습니다.
user207421

2

(첫 번째 게시물-깨끗하지 않을 수 있음)

이것은 OS X 11.6, Maven 기반 Netbeans 8.2 프로그램에 대한 수정 사항입니다. 지금까지 내 응용 프로그램은 100 % Netbeans입니다-조정할 필요가 없습니다 (불가능한 몇 가지 쉘 탈출!).

나는 여기와 다른 곳에서 대부분의 답을 시도했지만 아무 소용이 없었지만, "어떻게 작동하는지"라는 기술로 돌아 왔습니다.

여기에서 가장 좋은 답변 ( olivier-refalo thanx)은 시작하기에 적합한 장소처럼 보였지만 도움이되지 않았습니다.

효과가 있었던 다른 프로젝트를 살펴보면 매니페스트 라인에 약간의 차이가 있음을 알았습니다.

  1. addClasspath, classpathPrefix가 없습니다 (삭제)
  2. mainClass에 "com"이 없습니다. (NB-> 프로젝트 속성-> 실행-> 메인 클래스-> 찾아보기로 사용)

왜 (자바로 3 개월 만에) 있는지 또는 어떻게, 잘 모르겠지만 이것이 효과가 있다고 말할 수 있습니다.

다음은 사용 된 수정 된 매니페스트 블록입니다.

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

2

나쁜 매니페스트 생성에 대한 새로운 솔루션을 찾았습니다!

  1. WinRAR과 같은 zip 편집기로 jar 파일을여십시오.
  2. META-INF를 클릭하십시오

  3. 추가 또는 편집

    • 더하다:

      • META-INF라는 폴더에 MANIFEST.MF라는 텍스트 파일을 만들고 다음 줄을 추가하십시오.

        • 매니페스트 버전 : 1.0
        • 메인 클래스 : package.ex.com.views.mainClassName
      • 파일을 저장하고 zip에 추가하십시오

    • 편집하다:

      • 파일을 드래그하여 MANIFEST.MF를 수정하여 이전 줄을 추가하십시오.
  4. cmd를 열고 다음을 입력하십시오. java -jar c : /path/JarName.jar

이제 잘 작동합니다!


2

대부분의 솔루션이 나를 위해 작동하지 않았지만 강사가 나를 도와주었습니다. 여기에서 그의 솔루션을 공유하고 싶습니다 .kali linux terminal을 사용했지만 모든 데비안에서 괜찮을 것입니다.

javac *.java
nano MANIFEST.MF

파일 형식에서

메인 클래스 : 메인 또는 메인 파일 이름이 무엇이든 (패키지 이름이 있으면 추가하십시오)

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

지금 파일 사용을 실행

java -jar new.jar

또는 당신은 파일의 속성으로 이동하여 확인할 수 있습니다

프로그램으로 파일 실행 허용

더블 클릭

위의 답변 대부분이하지 않은 동안 그것은 나를 도왔습니다.


1

저와 같은 문제가있을 수 있습니다. .jar 파일을 작성한 후을 작성하십시오 jar xf app.jar META-INF/MANIFEST.MF. 그러면 파일의 사본을 현재 디렉토리에 작성하여 읽을 수 있습니다. 그것이 다음과 같이 말하면 :

매니페스트 버전 : 1.0

작성자 : 1.8.0_51 (Oracle Corporation)

"Main-Class"선언을 포함하지 않으면 문제를 발견했다고 생각합니다.

그래도 해결 방법을 모르겠습니다. StackOverflow에서 동일하거나 유사한 문제가있는 다른 사람들을 확인했는데 답을 찾을 수 없습니다. 그러나이 정보를 사용하면 더 나은 도움을 얻을 수 있습니다 (나와 같은 문제가 있다는 사실을 감안할 때).

편집 : 매니페스트 파일로 시도했지만 작동하지 않았지만 jar 파일을 만들 때 클래스 중 하나만 명명하는 것이 실수였습니다. 대신 * .class를 작성했으며 지금 작동합니다.

매니페스트 파일을 만들어야하는 이유를 모르겠습니다. 그러나 그것이 작동하는 한 괜찮습니다.


1

나는이 문제가 있었고 Netbeans 8에서 이것을 수행하여 최근에 해결했습니다 (아래 이미지 참조).

넷빈즈 프로젝트 속성

  1. 프로젝트의 속성 으로 이동 하십시오.
  2. 실행을 클릭 하십시오 .
  3. browse를 사용하여 프로젝트의 기본 클래스를 지정하십시오 .
  4. Jar 파일을 빌드 하고 실행 하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.