programing

IntelliJ IDEA의 잘못된 Manifest.mf가 .jar를 만들었습니다.

bestcode 2022. 11. 7. 22:07
반응형

IntelliJ IDEA의 잘못된 Manifest.mf가 .jar를 만들었습니다.

OptaPlanner 6.0.1 라이브러리를 사용한 프로젝트를 IntelliJ IDEA의 jar 아티팩트를 통해 .jar로 패키지화하려고 하는데 표준이 포함된 manifest.mf가 아닌

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

이 jar는 OptaPlanner의 지원 라이브러리 중 하나인 ecj-3.7.2.jar에 포함된 것을 사용합니다.

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

이 때문에,"no main manifest attribute, in appname.jar"앱을 실행하려고 할 때 오류가 발생합니다.수동으로 .jar 파일의 매니페스트를 내 것으로 바꾸면 모든 것이 정상적으로 동작합니다.이 문제를 해결하기 위해 제가 할 수 있는 일이 있나요?

라이브러리를 다른 /lib 디렉토리에 보관하고 있습니다.이러한 라이브러리는 jar 아티팩트의 루트에 Extracted Directory로 추가되어 있습니다.IntelliJ IDEA는 v13.0.1입니다.

저도 같은 문제가 있었어요.

매니페스트를 확인합니다.MF의 위치:

src/main/resources/META_INF/

것은 아니다.

src/main/java/META_INF/

수정 방법:

  1. [파일] > [File]
  2. 왼쪽의 프로젝트 설정에서 "아티팩트"를 선택합니다.
  3. 가운데 창에서 JAR 정의를 찾아 선택합니다.
  4. "출력 레이아웃" 탭의 왼쪽 창에서 목록에서 jar 파일을 찾아 선택합니다.
  5. 맨 아래에서 "기존 매니페스트 사용" 버튼을 클릭하고 프로젝트 원본에 있는 매니페스트 파일을 선택합니다.
  6. [확인]을 클릭하여 빌드를 실행합니다.

@grudolf의 다른 답변 중 하나에서 언급했듯이, 이를 위한 한 가지 방법(및 Import된 Gradle 프로젝트에서 유일하게 작동한 방법)은 다음과 같이 빈 병을 만드는 것입니다.

  • 프로젝트 구조 -> 아티팩트 -> + Jar -> 비어 있음
  • 이제 중앙 창에는 매니페스트 생성 및 기존 매니페스트 사용 버튼이 있습니다.이것들 중 하나를 사용하세요.
  • 자체 매니페스트를 가진 종속 라이브러리를 출력 루트에 추출하면 수동으로 새로 만든 매니페스트를 간헐적으로 덮어쓰는 것 같습니다.작전 순서를 가지고 장난치는 것이 효과가 있는 것 같았다.

갱신:

이것은 이데아의 버그입니다.이 링크된 답변은 추출된 디렉토리가 있을 때 안정적으로 작동합니다.기본적으로는 자신의 .idea/J를 찾을 수 있습니다.ARNAME.xml, 다음 요소를 맨 에 추가합니다.<root>네 항아리를 위한 요소.매니페스트를 포함하는 새 파일 복사본 위에 추출된 요소는 새 매니페스트를 클로빙합니다.

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

Main Class를 지정하려면 다음 플러그인을 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>

저도 비슷한 문제가 있었어요.

문제는 pom.xml 파일에 있었습니다.

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

이 코드가 왜 일식에서는 기능하는지는 모르겠지만 IntelliJ에서는 동작하지 않습니다.

이거 맞아요.

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

Manifest.mf가 작동했습니다!!

이게 도움이 됐으면 좋겠어요.

실행 가능한 jar를 생성하는 방법은 여러 가지가 있습니다.IntelliJ의 GUI 기능을 사용하는 것도 좋은 방법입니다.또 다른 방법은 빌드 서버 친화적인 Maven(또는 gradle, builder 등)을 사용하는 것입니다.

Optaplanner의 샘플 맵 빌드에서 복사 붙여넣기를 할 수 있습니다.

  1. 최종사용자 jar(optaplanner-examples-*.jar)는 의존관계 클래스 경로를 매니페스트에 포함해야 합니다.
  2. 그런 다음 sh and bat 스크립트는 그에 따라 해당 항아리를 실행해야 합니다.

Manifest와 같은 문제가 발생하지 않도록 하려면 "src" 디렉토리에 "META-INF"라는 이름의 디렉토리가 있어야 합니다.그래서 그것을 만들고 "MANIFest"라는 이름의 파일을 넣습니다.MF"는 다음과 같은 내용을 담고 있습니다.

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

위의 Main 클래스를 포함하는 패키지 이름을 바꾸는 것을 잊지 마십시오!

언급URL : https://stackoverflow.com/questions/20952713/wrong-manifest-mf-in-intellij-idea-created-jar

반응형