[java] jar 파일을 실행할 수 없습니다 : “주요 매니페스트 속성 없음”

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

java -jar “app.jar”

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

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

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



답변

첫째, 어떤 이상한의, 당신이 실행 볼 수 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'
        )
    }
}


답변

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? (이 클래스는 프로그램에 따라 다르므로 제공 한 정보로는 말할 수 없습니다).


답변

또는 아래 예제와 같이 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 파일 이름으로 바꾸지 말고 그대로 그대로 두어야합니다.


답변

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.

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


답변

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

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


답변

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

apply plugin: 'java'

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


답변

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

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

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