programing

jar-file을 실행할 수 없습니다: "기본 매니페스트 특성이 없습니다.

firstcheck 2022. 7. 2. 22:07
반응형

jar-file을 실행할 수 없습니다: "기본 매니페스트 특성이 없습니다.

애플리케이션을 인스톨 하고 있습니다만, 실행 가능한 jar(실행 가능한 jar)를 실행하려고 해도 아무 일도 일어나지 않습니다.명령줄에서 다음을 사용하여 실행할 경우:

java - jar "app.jar"

다음 메시지가 나타납니다.

"app.jar"에 기본 매니페스트 특성이 없습니다.

일반적으로 내가 직접 프로그램을 만들었다면 매니페스트 파일에 메인 클래스 속성을 추가했을 것입니다.하지만 이 경우, 어플리케이션에서 온 파일이기 때문에, 저는 그렇게 할 수 없습니다.메인 클래스를 찾을 수 있는지 보기 위해 항아리를 추출해 보았지만, 클래스가 많고, 이름에 메인이라는 단어가 들어 있는 것은 없습니다.다른 시스템에서 프로그램이 정상적으로 실행되므로 이 문제를 해결할 방법이 있을 것입니다.

먼저, 네가 도망가는 걸 보니 좀 이상해java -jar "app" andjava -jar app.jar

둘째, 항아리를 실행 가능한 파일로 만들려면...META-INF/MANIFest라는 파일을 저장해야 합니다.MF

파일 자체에 적어도 다음 라이너가 있어야 합니다.

Main-Class: com.mypackage.MyClass

서 ★★★★★com.mypackage.MyClass퍼블릭 스태틱 보이드메인(String[] args) 엔트리 포인트를 유지하는 클래스입니다.

CLI, Maven, Ant 또는 Gradle 중 하나를 사용하여 이를 수행하는 방법은 여러 가지가 있습니다.

CLI의 경우 다음 명령어를 사용합니다(tks @dvvrt).

jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar  <files to include>

Maven의 경우 다음과 같은 조각이 도움이 될 것입니다.이것은 플러그인 정의일 뿐 완전한 pom.xml이 아닙니다.

이 플러그인의 최신 문서: https://maven.apache.org/plugins/maven-jar-plugin/를 참조하십시오.

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

(프로젝트에 적합한 것을 선택합니다.)

Ant의 경우 다음 스니펫이 도움이 됩니다.

<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.jarjava -jar "app".

-jar파일일 는 JAR 파일이 에 JAR이 을 의미합니다.Main-Class속성을 지정합니다.실행 가능한 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-with-dependencies는 말 그대로 포함할 jar 파일명으로 대체하지 않도록 해야 합니다.

이는 Java가 MANPAST에서 Main 속성을 찾을 수 없기 때문입니다.MF 파일기본 속성은 Java가 응용 프로그램의 진입점으로 사용해야 하는 클래스를 알려 주는 데 필요합니다.항아리 파일 안에, 매니페스트.MF 파일은 META-INF 폴더에 있습니다.어떻게 항아리 파일 안에 있는 걸 볼 수 있지?WinRAR을 사용하여 jar 파일을 엽니다.

매니페스트 내의 메인아트리뷰트MF는 다음과 같습니다.

Main-Class: <packagename>.<classname>

이 행이 MANPAST에서 누락되면 "no main manifest attribute" 오류가 발생합니다.MF 파일

매니페스트 내에서 이 속성을 지정하는 것은 매우 복잡합니다.MF 파일

업데이트: 어플리케이션의 시작점을 일식으로 지정할 수 있는 매우 훌륭한 방법을 방금 찾았습니다.[ Export ]라고 하면

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.

여기에 이미지 설명 입력

저도 같은 문제가 있었어요.폼 파일에 행을 추가함으로써 동작하게 되었습니다.플러그인은 필요한 모든 단계를 통해 응용 프로그램의 빌드 프로세스를 확인합니다.

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

IntelliJ IDEA를 사용하여 항아리를 만들 때 문제가 있었습니다.이 설명을 참조해 주세요.

이 문제를 해결한 것은 JAR > From modules with dependences 순으로 jar 아티팩트를 재작성하는 것입니다.단, META-INF/MANIFest의 디폴트 디렉토리는 받아들이지 않습니다.MF. -/src/main/java에서 -/src/main/resources로 변경합니다.

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

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>

건배...

Gradle 답변은 다음과 같은 jar/manifest/attribute 설정을 추가하는 것입니다.

apply plugin: 'java'

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

다음 명령을 사용하여 jar를 포함하십시오.

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

저는 어떤 답변도 도움이 되지 않았습니다.메인 클래스 등 모든 것이 포함된 매니페스트 파일을 올바른 위치에 보관하고 있었습니다.나를 넘어뜨린 것은 다음과 같다.

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

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

Maven을 사용하는 경우 폼에 다음을 포함합니다.

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

MAVEN의 문제는 첫 번째 매니페스트를 포함하려고 한다는 것입니다.첫 번째 라이브러리의 MF 파일(우리의 매니페스트 대신 종속성 파일)입니다.MF 사용!

  1. yourjar.jar의 이름을 yourjar로 변경합니다.지퍼
  2. 매니페스트를 엽니다.META-INF\MANIFest의 MF 파일.MF
  3. 실제 매니페스트를 복사합니다.MAVEN에 의해 프로젝트에서 이미 생성된 MF에는 다음과 같은 특징이 있습니다.

    매니페스트 버전: 1.0 메인 클래스: your packet.your main class(exmaple info.data의 경우).메인 클래스)

  4. 매니페스토의 내용을 바꿉니다.유자르에서 MF.지퍼로 잠급니다.

  5. 항아리 이름을 바꾸세요.yourjar.jar.jar 뒤로
  6. 이제 java -jar yourjar.jar가 완벽하게 작동합니다.

아니면!

간단히 나만의 매니페스트를 만들 수 있습니다.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. 다음 코드를 you 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. Intelij에서 MAVEN 패널을 열고 "설치"를 실행합니다.MANPAST 파일을 생성하고 모든 종속성을 가진 JAR 파일을 "Target" 폴더로 컴파일합니다.또한 로컬 maven 저장소에 설치됩니다.

저도 오늘 같은 문제가 있었어요.META-INF를 Resources 폴더로 옮기는 문제가 해결되었습니다.

방금도 같은 에러가 났어요. 」를 사용하고 있는 gradle, 하다, 하다를 .gradle.build:

apply plugin: 'java'

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

서 ★★★★★com.company.project.MainClass「」를 포함한 .public static void main(String[] args)★★★★★★ 。

항아리가 규칙을 따르지 않으면 실행 가능한 항아리가 아닙니다.

명령줄을 사용하여 .jar를 조립하는 경우 매니페스트 파일을 추가하지 않고 메인을 가리킬 수 있습니다.예:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

('e'는 다음과 같은 기능을 합니다.Name Of Class With Main Method는 메서드 main() 및 app.jar(실행 가능 파일 .jar 및 *.class 이름)를 가진 클래스의 이름입니다.

저도 같은 문제가 있었어요.여기서 설명한 솔루션 중 많은 부분이 전체적인 그림을 보여주지 못했기 때문에 명령줄에서 jar 파일을 패키징하는 방법에 대해 간략히 설명하겠습니다.

  1. 의 것을 갖고 .class 내의 , "패키지의 선두에 합니다..java.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
    
  2. your your your your your로 .class패키지 이름으로 지정된 구조로 끝나는 파일은 다음과 같습니다.

    javac -d . Test.java
    

    -d .컴파일러가 원하는 디렉토리 구조를 작성하도록 합니다.

  3. 「 」를 할.jar파일, 어떻게 포장해야 하는지 항아리 루틴에 지시해야 합니다.서는 옵션 합니다.cvfeP패키지 구조(옵션)를 유지하기 위해서입니다.P매니페스트 파일에 의미 있는 정보가 포함되도록 진입점을 지정합니다(옵션).e) 。f 파일 이름, , 옵션, 이름을 지정할 수 .c 및 " " " 를 만듭니다.v는 출력을 상세하게 설정합니다.여기서 주의할 점은 다음과 같습니다.P ★★★★★★★★★★★★★★★★★」e.

    우리가 .test.jar.

    다음으로 진입점이 나옵니다.

    그리고 나서-C . <packagename>/폴더 구조를 보존하고 해당 폴더에서 클래스 파일을 가져옵니다.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
    
  4. 해 주세요..jar지퍼로 잠그다 있어야 .

    test.jar.

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

    매니페스트MF는 다음을 포함해야 합니다.

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

    매니페스트를 수동으로 편집하는 경우, 반드시 맨에 새 줄을 유지하십시오. 그렇지 않으면 Java가 이를 인식하지 못합니다.

  5. 을 수행합니다..jar

    java -jar test.jar
    

저는 개인적으로 여기 있는 모든 답은 질문을 잘못 이해하고 있다고 생각합니다.이에 대한 해답은 스프링 부트에서 .jar를 빌드하는 방법의 차이에 있습니다.Spring Boot는 다음과 같은 매니페스트를 셋업하고 있다는 것은 누구나 알고 있습니다.이것은 표준적인 .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★★★★★★★★★★★★★★★★★★?

같은 문제에 직면하여 해결되었습니다:) 다음 단계를 따르기만 하면 오류가 발생할 수 있지만 다음 단계를 수행하면 프로세스가 더 원활해집니다.나는 해결책을 찾는데 많은 시간을 들인다.

1. Eclipse를 재기동합니다(Eclipse를 사용하여 JAR 파일을 빌드하는 경우).실제로 JAR 파일을 정상적으로 내보내는 데 도움이 되었습니다.

2.After 일식 재시작, 만약 여러분의 일식 당신의 자바 프로젝트의 주요 class/method을 알아챌 수 없다를 보는 것-->오른쪽 클릭하여,<>입니다만 움직여 주세요-->실행 구성,>메인,>검색 단추 당신의 일식은 JAR 파일에서 너의 주된 수업에 lookup 수 있을지이죠.>이 JAR 파일 할 타당성 확인을 위한 것이다. 에 대한 진입점메인 클래스

  1. 그런 다음 Java Dynamic 프로젝트를 JAR 파일이 아닌 "Runnable JAR" 파일로 내보냅니다.

  2. Java 부팅 구성에서 기본 클래스를 선택합니다.

  3. jar 파일을 내보낸 후 다음 명령을 사용하여 실행합니다.java - cp [ Your JAR ]항아리[완전 패키지]메인 클래스 예: java - cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRule Audit

  4. 지원되지 않는 Java 버전 오류가 발생할 수 있습니다.수정은 셸 bash 프로파일의 java_home을 이클립스 프로젝트의 컴파일에 사용되는 Java 버전과 일치하도록 변경하는 것입니다.

이게 도움이 됐으면 좋겠네요!아직 문제가 있으시면 알려주세요.

잘못된 매니페스트 생성에 대한 새로운 해결책을 찾았어요!

  1. WinRAR과 같은 zip 에디터로 jar 파일을 엽니다.
  2. META-INF를 보려면 클릭하십시오.

  3. 추가 또는 편집

    • 추가:

      • 매니페스트라는 텍스트 파일을 만듭니다.META-INF라는 폴더에 MF를 입력하고 다음 행을 추가합니다.

        • 매니페스트 버전: 1.0
        • 메인 클래스 : package.ex.comviews.mainClassName
      • 파일을 저장하고 zip에 추가합니다.

    • 편집:

      • 파일을 끌어 MANIFIST를 수정합니다.MF를 사용하여 이전 행을 추가합니다.
  4. cmd를 열고 java -jar c:/path/JarName을 입력합니다.항아리

이제 잘 될 거야!

실행 가능한 jar 파일java - jar app.jar와 같은 명령 프롬프트를 클릭하거나 사용하여 실행해야 합니다(예를 들어 jar의 경로에 공백이 포함되어 있는 경우).실행 가능한 jar가 실행되고 있지 않은 경우, 이는 jar가 올바르게 생성되지 않았음을 의미합니다.

자세한 내용을 보려면 jar 파일을 추출하고(또는 Windows 7-Zip의 경우 도구를 사용하여 보기), /META-INF/MANIFest 아래의 파일을 확인하십시오.MF입니다. 만약 이런 엔트리가 발견되면

메인 클래스 : your.package.nameClaaswithMain - 그럼 괜찮습니다.그렇지 않으면 제공하셔야 합니다.

MANIFEST에 Main-Class 엔트리를 추가하는 것에 주의해 주세요.MF 파일 저장 위치를 확인하십시오!

이 단계를 간단히 수행할 수 있습니다. 다음을 사용하여 jar 파일을 만듭니다.

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

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

 java -cp jarfile-name main-classname

jar 파일이 제대로 생성되지 않았을 수 있습니다.

ex: jar 생성에 옵션 m이 없습니다.

다음과 같은 기능이 있습니다.

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

가 ★★★★★★★★★★★★★★★★★★★★★★★★★★.<pluginManagement>아래<build>이데올로기 때문에

내 원래 pom.xml:

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

★★★를 한 후<pluginManagement>에러가 해소되었습니다.

이 오류는 단순히 이클립스에게 단순한 라이브러리 jar 파일이 아니라 실행 가능한 jar 파일을 원한다고 말하는 것을 잊었기 때문에 발생했습니다.따라서 Eclipse에서 jar 파일을 생성할 때 오른쪽 라디오 버튼을 클릭했는지 확인하십시오.

위의 답변은 저에게 일부만 도움이 되었습니다. 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에 실행할 기본 클래스가 포함되어 있습니다.당신이 필요한 수업이 항상 첫 번째 수업이라고 생각할 수 있을지는 모르겠지만, 그것은 나를 위한 것이었다.그렇지 않다면 GREP를 사용하여 라이브러리 관련 결과를 배제하고 클래스 목록을 관리 가능한 크기로 줄이는 것은 어렵지 않을 것입니다.

거기서부터 그것은 쉬웠다.이 경로(".class" 접미사 제외):

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

이걸 해봤는데 잘 되더라고요.mvn 클린 인스톨 패키지가 동작할 거예요.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
            </executions>
        </plugin>
    </plugins>
</build>

매니페스트를 추가했으니까.MF, 이 파일의 필드 순서를 고려해야 할 것 같습니다.저의 부러운 점은java version "1.8.0_91"

그리고 나의 매니페스토.여기와 같은 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

(첫 번째 포스트 - 깨끗하지 않을 수 있음)

이것은 OS X 11.6, Maven 기반의 Netbeans 8.2 프로그램에 대한 수정 사항입니다.지금까지 제 앱은 100% Netbeans입니다.트위치는 없습니다(불가능한 것은 몇 개의 셸 이스케이프!).

이곳저곳에서 대부분의 답을 시도해 봤지만 소용이 없었으므로, 나는 다시 "잘 되는 것을 사용하라"는 기술로 돌아왔다.

여기서 가장 중요한 답변(olivier-refalo thanx)은 적절한 시작점이라고 생각했지만 도움이 되지 않았습니다.

효과가 있었던 다른 프로젝트를 보면 매니페스트 라인에 몇 가지 사소한 차이가 있었습니다.

  1. addClasspath, classpathPrefix가 없습니다(삭제).
  2. main Class에 com이 없습니다.(NB -> Project Properties -> Run -> Main Class -> Browse를 사용하여 지정)

이유(Java를 시작한 지 3개월밖에 안 되었지만)는 모르지만, 이 방법은 효과가 있었다고 밖에 말할 수 없습니다.

사용된 매니페스트 블록은 다음과 같습니다.

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

한 가지 분명히 하기 위해

Main-Class: <packagename>.<classname>

패키지가 없는 경우 다음과 같이 해당 부품을 무시해야 합니다.

Main-Class: <classname>

언급URL : https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute

반응형