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のサポートライブラリの1つである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アーティファクトのルートに追加しました。IntelliJIDEAはv13.0.1です。


1
ant、maven、gradleなどのビルドツールを知っていますか?
MariuszS、2014年

それらについては知っていますが、これまではmakeと.NETの対応物(NAnt、MSBuild)のみを使用しました。IntelliJのビルドツールでカットできない場合、どれを選択すればよいですか?
grudolf 2014年

1
ここでこの問題を修正するために投票してください
bigjosh 2016年

回答:


260

私も同じ問題を抱えていました。

MANIFEST.MFが次の場所にあることを確認します。

src/main/resources/META_INF/

ない

src/main/java/META_INF/

20
これは正解です。プロジェクトテンプレートがMavenの場合、Intellij IDEAはMETA-INFフォルダーを誤って配置しているようです
Kumait

私の場合、プロジェクトのレイアウトを変更する必要がありました。以前はmavenレイアウトのプロジェクトがありましたが、mavenのサポートを削除しました。私はプロジェクトを一から作り直しましたが、うまくいきました。
Maxence

1
これは私にとってはうまくいきませんでした。Mainfestファイルをプロジェクトのルートに移動する必要がありました。
2016年

Mavenはこのファイルを間違ったディレクトリに置くほど愚かですか?:^)
ダリア

@Kumait、問題はまだIntelliJ 2017.1.5にあります。JetBrainチームはこれを認識しているかどうか疑問に思っています。
fruqi 2017

12

修正するには:

  1. ファイル>プロジェクト構造
  2. 下のプロジェクトの設定左側に、「アーティファクト」を選択
  3. 中央のペインでJAR定義を見つけて選択します
  4. [出力レイアウト]タブの左側のペインで、リストからjarファイルを見つけて選択します
  5. 下部にある[既存のマニフェストを使用]ボタンをクリックし、プロジェクトソースにあるマニフェストファイルを選択します。
  6. [OK]をクリックしてビルドを実行します

3
「既存のマニフェストを使用」ボタンはありませんが、出力レイアウトのマニフェストファイルは正しい場所(... \ src \ main \ java \ META-INF \ MANIFEST.MF)を指しています
grudolf

5
OK、jarアーティファクトを削除して再作成する必要がありましたが、今回は「依存関係のあるモジュールから」ではなく「空」として作成しました。[マニフェストの作成]ボタンと[既存のマニフェストの使用]ボタンを使用して、マニフェストと読み取り済みのライブラリをポイントし、出力をコンパイルします。以前とは2つの違いがあります。META_INF\ MANIFEST.INFが出力レイアウトに明示的に含まれるようになり、jarファイルが正しく生成されているように見えます。:)
grudolf 2014年

これは、少なくとも私にとっては問題を解決しません。しかし、Jamahnの答えはうまくいきました。
Andrew Breksa 2014年

次のように低担当ユーザー@ ds-justiceから追加されたコメント-空のJarの作成に関する上記の@grudolfのコメントは、インポートされたGradleプロジェクトで数時間苦労した後、私のために機能した唯一のものでした。これは重要な質問です。コメントを別の回答として再投稿することを検討してください。
Shawn Mehan、2015年

10

他の回答の1つにある@grudolfのコメントで述べたように、これを行う1つの方法(およびインポートされたGradleプロジェクトで私のために機能した唯一の方法)は、次のように空のjarを作成することです。

  • プロジェクト構造->アーティファクト-> + Jar->空
  • センターペインに[マニフェストを作成]ボタンと[既存のマニフェストを使用]ボタンが追加されました。これらのいずれかを使用してください。
  • 独自のマニフェストを含む依存ライブラリを出力ルートに抽出すると、手動で作成された新しいマニフェストを断続的に上書きするように見えました。操作の順序をいじるのはそれを機能させるようでした。

更新:

これは間違いなくIdeaのバグです。 このリンクされた回答は、抽出されたディレクトリがある場合に確実に機能します。基本的に、.idea / JARNAME.xmlを見つけたら、次の要素をjarの要素の最上部に追加<root>します。マニフェストを含む新しいファイルコピーの上に抽出された要素は、新しいマニフェストを破壊します。

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

7

メインクラスを指定する場合は、このプラグインを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>

このコードがEclipseで機能する理由はわかりませんが、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機能を使用することは、1つの良い方法です。別の方法は、Mavenを使用することですビルドサーバーに対応した(またはGradle、ビルダーなど)を使用することです。

それは多かれ少なかれoptaplannerの例のmavenビルドからコピーして貼り付け可能です:

  1. エンドユーザーjar(optaplanner-examples-*。jar)は、依存関係のクラスパスをマニフェストに含める必要があります
  2. 次に、shおよびbatスクリプトは、それに応じてそのjarを実行する必要があります。

0

マニフェストのように問題が発生しないようにするには、「src」ディレクトリに「META-INF」という名前のディレクトリが必要です。したがって、それを作成し、次の内容で「MANIFEST.MF」という名前のファイルを入れます。

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

上記のメインクラスを含むパッケージの名前を置き換えるのを忘れないでください!


4
その記録は、私が8月にあなたの投稿から宗教的な資料を削除したこと示しています。コミュニティが宗教的なテーマを投稿に追加することについて話し合ったので注意しください。答えは、私たちはむしろそれらを除外したいということです。ただし、プロフィールやアバターに追加することは大歓迎です。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.