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

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입니다.



답변

나는 같은 문제가 있었다.

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

src/main/resources/META_INF/

아니

src/main/java/META_INF/


답변

고치다:

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

답변

다른 답변 중 하나에서 @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>


답변

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, buildr 등에서 유사하게)을 사용하는 것입니다.

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

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

답변

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

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

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