web-dev-qa-db-ja.com

Intellij 2016でJarを作成する-メインマニフェスト属性がありません

no main manifest attribute Intellijによるjar作成の実行中。 jarを抽出し、アーティファクトの作成中に指定したものではなくanotherマニフェストファイルがあることを確認しました。

IDEでマニフェストを開くと、すべてが正しく表示されますが、jarを作成すると、まったく新しいマニフェストファイルが取得されます。

Manifest-Version: 1.0
Main-Class: YoutubeList

私は他の答えからすべてのソリューションを試してみましたが、それでもまだうまくいきませんでした。単純なjarの作成がIntellijのタスクの地獄である理由は、開発者を支援することになっています!

編集済み

また、Jarに.classファイルが含まれない場合があり、その結果could not found or load class

28
mallaudin

私は、Mavenビルドでも同じ問題に悩まされていました。プロジェクト構造設定(ctrl + alt + shift + S)から成果物を作成する場合、マニフェストディレクトリを変更する必要があります。

<project folder>\src\main\Java 

change Javaリソースに

<project folder>\src\main\resources

ターゲットJARへのオプション抽出も使用しましたが、うまく機能しています。

[〜#〜] edit [〜#〜]

詳細なステップバイステップ、他の解決策はこちらにあります: https://stackoverflow.com/a/45303637/2640826

59
Zsolt Tolvaly

次のように、pom.xmlに参照され、完全修飾されたメインクラスがあることを確認します。

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>org.mypkg.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

(...もちろん、プラグインのバージョン番号は異なる場合があります)。

完全に修飾されていないメインクラスは、(参照をローカルで満たすために)マニフェストを別の場所に移動することを人々に勧めるものです。

5
Jool

私はそれを解決するために数日を費やしました。私の解決策: this answer にあるプロジェクトをロードしました。次に、ロードしたプロジェクトと自分のプロジェクトの設定を比較して修正しました。比較/修正しました:

  • 実行/デバッグ構成
  • MANIFEST.MF
  • progect構造設定:プロジェクト、モジュール(ソース、リソースなどをマーク)、アーティファクト。

最後に、META-INFをリソースディレクトリに配置しました。

たぶん私は余分な行動をしたが、それは私のために働いた:)

追伸また、Progect構造設定->モジュール->パスで「プロジェクトのコンパイル出力パスを継承」を選択する必要があります

enter image description here

5
Maksim Ryabovol

META-INFフォルダーを*/resourcesに入れることはできますが、そうではありません:Intellijはすべてをmain/resourcesの下に置くか、 test/resources生成されたjarのルートレベルにあるため、動作します。ただし、Javaプロジェクトでは、通常はsrcと同じレベルのプロジェクトルートの下に配置します。 "リソース"の下に配置すると、慣例に違反します。リソースファイルではありません。

以下を確認してください:

  • プロジェクトルートで既存のMANIFEST.MFファイルを使用します。
  • メインクラスは正しいです
  • [プロジェクト構造]-> [アーティファクト]パネルでInclude in Project buildにチェックマークを付けました
  • META-INFタブに、「プロジェクトコンパイル済み出力」とは別に、jarに含めるファイルにOutput Layoutフォルダーがリストされている
  • 生成されたファイルタイプはJARで、右上隅にあります

そして、設定を保存し、再度ビルドします、そして「ビルド」メニューに入り「アーティファクトをビルドします。」、そしてJARを「ビルド」します。生成されたjarを再度確認し、Java -jarで実行します。

enter image description here

3
WesternGun

実際、build.gradleに次の行を追加することで解決しました

jar {
    manifest {
        attributes 'Main-Class': 'class name'
    }
    from {
        configurations.compile.collect {
            it.isDirectory()? it: zipTree(it)
        }
    }
}
2
mallaudin

File/Project structure/Artifacts jarのビルド方法を指定できます。マニフェストとして既存のファイルを使用するか、新しいファイルを作成するかを選択できます。この場合、メインクラスとクラスパスを指定します...

1
Per Huss

投稿されたものとは異なる解決策を見つけました。 .jarファイルの内容を作成するために使用されるIntelliJプロジェクト構造ダイアログでは、マニフェストファイルを含むMETA-INFフォルダーを手動で追加する必要がありました。プロジェクト構造ダイアログボックスの最後の外観を次に示します。 jarの内容のリストにフォルダーが表示されない場合、マニフェストファイルはjarファイルの一部ではありません。

This is part of the Project Structure Dialog box

フォルダーを手動で含めるには、プラス記号をクリックし、[ディレクトリコンテンツ]オプションを選択して、META-INFフォルダーに移動します。

0
J.E.Tkaczyk