IntelliJ IDEA의 잘못된 Manifest.mf가 .jar을 생성했습니다.


102

IntelliJ IDEA의 jar 아티팩트를 통해 OptaPlanner 6.0.1 라이브러리를 사용하는 프로젝트를 .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 아티팩트의 루트에 추가되었습니다. IntelliJ IDEA는 v13.0.1입니다.


1
ant, maven 또는 gradle과 같은 빌드 도구를 알고 있습니까?
MariuszS

나는 그들에 대해 알고 있지만 지금까지 나는 make와 .NET 대응 물 (NAnt, MSBuild)만을 사용했습니다. IntelliJ의 빌드 도구가 그것을 자르지 않을 경우 어느 것을 선택해야합니까?
grudolf 2014-01-06

1
여기 에서이 문제를 해결하기 위해 투표 하십시오 .
bigjosh

답변:


260

나는 같은 문제가 있었다.

MANIFEST.MF가 다음 위치에 있는지 확인하십시오.

src/main/resources/META_INF/

아니

src/main/java/META_INF/

20
프로젝트 템플릿은 메이븐 때하게 IntelliJ IDEA는 META-INF 폴더를 관리 못하는 것 같다, 정답 참
Kumait

제 경우에는 프로젝트의 레이아웃을 변경해야했습니다. 이전에 maven 레이아웃이있는 프로젝트가 있었지만 maven 지원을 제거했습니다. 처음부터 프로젝트를 다시 만들고 이제 작동합니다.
Maxence 2015-06-16

1
이것은 나를 위해 작동하지 않았으며 Mainfest 파일을 프로젝트의 루트로 이동해야했습니다.
racs

Maven이 너무 멍청 해서이 파일을 잘못된 디렉토리에 넣습니까? : ^)
다리아

@Kumait, IntelliJ 2017.1.5에는 여전히 문제가 있습니다. JetBrain 팀이 이것을 알고 있는지 궁금합니다.
fruqi

12

고치다:

  1. 파일> 프로젝트 구조
  2. 아래 프로젝트 설정 왼쪽에있는 "이슈"를 선택
  3. 중간 창에서 JAR 정의를 찾아 선택합니다.
  4. "출력 레이아웃"탭의 왼쪽 창에서 목록에서 jar 파일을 찾아 선택합니다.
  5. 하단에서 "기존 매니페스트 사용"버튼을 클릭하고 프로젝트 소스에있는 매니페스트 파일을 선택합니다.
  6. 확인을 클릭하고 빌드를 실행하십시오.

3
"기존 매니페스트 사용"버튼은 없지만 출력 레이아웃의 매니페스트 파일이 올바른 위치 (... \ src \ main \ java \ META-INF \ MANIFEST.MF)를
가리키고 있습니다

5
좋습니다. jar 아티팩트를 삭제하고 다시 만들어야했습니다. 이번에는 "종속성이있는 모듈에서"대신 "비어 있음"으로 표시됩니다. "Create Manifest"및 "Use Existing Manifest"버튼이 있고, 내 Manifest 및 readded 라이브러리를 가리키고 출력을 컴파일합니다. 이전과는 두 가지 차이점이 있습니다. 이제 META_INF \ MANIFEST.INF가 출력 레이아웃에 명시 적으로 포함되고 jar 파일이 올바르게 생성 된 것 같습니다. :)
grudolf 2014-01-06

이것은 적어도 나를 위해 문제를 해결하지 못합니다. 그러나 jamahn의 대답은 작동했습니다.
Andrew Breksa 2014

저 반복 사용자 @ ds-justice에서 다음과 같이 추가 된 댓글-빈 Jar를 만드는 것에 대한 위의 @grudolf의 댓글은 가져온 Gradle 프로젝트로 몇 시간 동안 고군분투 한 후에 저에게 효과적이었습니다. 이것은 중요한 질문입니다. 귀하의 의견을 별도의 답변으로 다시 게시 해보십시오.
Shawn Mehan 2015

10

다른 답변 중 하나에서 @grudolf의 의견에서 언급했듯이이를 수행하는 한 가지 방법 (그리고 가져온 Gradle 프로젝트에서 나를 위해 일한 유일한 방법)은 다음과 같이 빈 항아리를 만드는 것입니다.

  • 프로젝트 구조-> 아티팩트-> + Jar-> 비어 있음
  • 이제 가운데 창에 매니페스트 만들기 및 기존 매니페스트 사용 버튼이 있습니다. 이 중 하나를 사용하십시오.
  • 자체 매니페스트가있는 종속 라이브러리를 출력 루트에 추출하면 어려움이 있었는데, 수동으로 새로 만든 매니페스트를 간헐적으로 덮어 쓰는 것처럼 보였습니다. 작업 순서를 엉망으로 만드는 것이 제대로 작동하는 것처럼 보였습니다.

최신 정보:

이것은 확실히 Idea의 버그입니다. 이 연결된 답변 은 추출 된 디렉토리가있을 때 안정적으로 작동합니다. 본질적으로 .idea / JARNAME.xml을 찾고 항아리 의 요소 맨 위에 다음 요소를 추가하십시오 <root>. 매니페스트를 포함하는 새 파일 사본 위에 추출 된 요소는 새 매니페스트를 방해합니다.

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

7

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>

1

비슷한 문제가있었습니다.

문제는 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가 작동했습니다!

이게 도움이 되길 바란다.


나는이 정확한 상황을 가지고 있었고 당신과 같은 결론에 도달했습니다. <Dependencies> 항목 사이의 줄 바꿈은 Eclipse에서 작동했지만 Intellij IDEA에서는 작동하지 않았습니다.
Arion Krause

0

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

optaplanner 예제 maven 빌드에서 다소 복사 붙여 넣기 가능합니다.

  1. 최종 사용자 jar (optaplanner-examples-*. jar)는 매니페스트에 종속성의 클래스 경로를 포함 해야합니다 .
  2. sh 및 bat 스크립트 는 그에 따라 해당 jar를 실행해야합니다.

0

Manifest와 같은 문제를 일으키지 않으려면 "src"디렉토리에 "META-INF"라는 이름의 디렉토리가 있어야합니다. 그래서, 그것을 생성하고 다음과 같은 내용으로 "MANIFEST.MF"라는 파일을 그 안에 넣으십시오.

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

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


4
기록에 따르면 내가 8 월에 당신의 게시물에서 종교 자료를 다듬 었습니다. 주의하시기 바랍니다 지역 사회가 종교적인 주제를 추가 논의한 게시물로하고, 대답은 우리가 오히려 그들이 탈락 한 것입니다. 하지만 프로필이나 아바타에 추가하는 것은 가장 환영합니다.
halfer dec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.