web-dev-qa-db-ja.com

Jarファイルを実行できません:「メインマニフェスト属性なし」

実行しようとしてもアプリケーションがインストールされています(実行可能jarファイルです)。何も起こりません。私がコマンドラインからそれを実行すると:

Java -jar "app.jar"

次のようなメッセージが表示されます。

"app.jar"にメインマニフェスト属性はありません

通常、自分でプログラムを作成した場合は、マニフェストファイルにメインクラスの属性を追加します。しかし、この場合、ファイルはアプリケーションからのものなので、それはできません。私はまた、メインクラスが見つかるかどうかを調べるためにjarファイルを解凍してみましたが、クラスが多数あり、それらのどれにも「main」という単語が含まれていません。プログラムは他のシステムでも正常に動作するため、これを修正する方法が必要です。

762
Ewoud

まず、Java -jar "app"ではなくJava -jar app.jarを実行しているのを見るのはちょっと変です

次に、jarを実行可能にするには... META-INF/MANIFEST.MFというファイルをjarする必要があります。

ファイル自体は(少なくとも)次の1つのライナーを持つべきです。

Main-Class: com.mypackage.MyClass

com.mypackage.MyClassは、public static void main(String [] args)エントリポイントを保持するクラスです。

CLI、Maven、Ant、またはGradleを使用してこれを実行する方法はいくつかあります。

_ cli _ の場合、次のコマンドが実行されます。(tks @ dvvrtjar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

Maven の場合、次のようなコードでうまくいくはずです。これは単なるプラグイン定義であり、完全な pom.xml ではないことに注意してください。

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

(プロジェクトに適した <version> を選択してください。)

Ant の場合、以下のスニペットが役に立ちます。

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

クレジットMichael Niemand -

Gradle の場合:

plugins {
    id 'Java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}
748
Olivier Refalo

それはJava -jar app.jarではなくJava -jar "app"であるはずです。

-jarオプションは、JARファイルが実行可能なJARファイルである場合にのみ機能します。つまり、Main-Class属性を含むマニフェストファイルが必要です。実行可能JARの作成方法については、 JARファイル内のプログラムのパッケージ化 を参照してください。

実行可能JARではない場合は、次のようにプログラムを実行する必要があります。

Java -cp app.jar com.somepackage.SomeClass

com.somepackage.SomeClassは、プログラムを実行するためのmainメソッドを含むクラスです。 (そのクラスはプログラムによって異なります。提供した情報からはわかりません)。

229
Jesper

あるいは、以下の例に示すように、maven-Assembly-pluginを使うことができます。

<plugin>
    <artifactId>maven-Assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

この例では、sectionで指定されたすべての依存関係jarが自動的にあなたの単一のjarファイルに含まれます。 jar-with-dependenciesは、含めたいjarファイルの名前で置き換えられるのではなく、文字通りのように置かれるべきであることに注意してください。

95
CodeBrew

これは、JavaがMANIFEST.MFファイルでMain属性を見つけられないためです。 Main属性は、どのクラスをアプリケーションのエントリポイントとして使用するかをJavaに指示するために必要です。 jarファイルの中では、MANIFEST.MFファイルはMETA-INFフォルダーにあります。あなたはどのようにjarファイルの中にあるものを見ることができるか疑問に思いますか? WinRARでjarファイルを開きます。

MANIFEST.MF内の主な属性は次のようになります。

Main-Class: <packagename>.<classname>

この行がMANIFEST.MFファイルにないと、この「メインマニフェスト属性なし」エラーが発生します。

MANIFEST.MFファイルの中でこの属性を指定するのは本当に大変です。

更新日:私はちょうどEclipseでアプリケーションのエントリポイントを指定するための本当にきれいな方法を見つけました。 Exportと言うと

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.

enter image description here

54

Gradleの答えは、jar/manifest/attributes設定を次のように追加することです。

apply plugin: 'Java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
27
QED

Mavenにとって、これがそれを解決したものです(私にとっては、GitHub上のVeetleコードベースに対して)。

<build>
<plugins>
  <plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

乾杯...

23
Dave

Jarを含めるには、このコマンドを試してください。

Java -cp yourJarName.jar your.package..your.MainClass
22
Burhan ARAS

私は同じ問題を抱えていました。 pomファイルに次の行を追加することで動作しました。プラグインはあなたのアプリケーションのビルドプロセスをすべての必要なステップで確認します。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
18

IntelliJ IDEAを使用してjarファイルを作成するときにこの問題が発生しました。 このディスカッション を参照してください。

私が解決したのは、JAR> From modules to From dependenciesを選択し、META-INF/MANIFEST.MFのデフォルトディレクトリを受け入れずに、jarアーティファクトを再作成することでした。 - /src/main/Javaから - /src/main/resourcesに変更してください。

それ以外の場合は、jarファイルにマニフェストファイルが含まれていましたが、 - /src/main/Javaに含まれているはずのものは含まれていませんでした。

18
morningstar

私にとっては、答えのどれも本当に役に立ちませんでした - 私はメインクラスとすべてを含むマニフェストファイルを正しい場所に持っていました。私がつまずいたのはこれです。

警告:マニフェストを作成しているテキストファイルは、改行またはキャリッジリターンで終わる必要があります。最後の行が改行またはキャリッジリターンで終わっていない場合、最後の行は正しく解析されません。

ソース )。マニフェストの最後に改行を追加して修正しました。

12
eis

Mavenを使用している場合は、pomに以下を含めてください

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<properties>
    <Java.version>1.8</Java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
9
shuang

今日も同じ問題がありました。私の問題は、META-INFをresourcesフォルダーに移動することで解決されました。

9
RegUser

私は今同じエラーを受けました。もしgradleを使っているのなら、ur gradle.buildに次のものを追加するだけです。

apply plugin: 'Java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}

com.company.project.MainClasspublic static void main(String[] args)メソッドを持つurクラスへのパスです。

9
Binakot

私は同じ問題に直面し、それは今修正されています:)以下のステップに従うだけでエラーは何のためのものかもしれませんが、以下のステップはプロセスをより円滑にします。私は修正を見つけるために多くの時間を費やします。

1. Eclipseを再起動してみてください(あなたがJARファイルをビルドするためにEclipseを使っているならば) - >実際、これはJARファイルを正しくエクスポートすることにおける私の問題を助けました。

2. Eclipseの再起動後、EclipseがJavaプロジェクトによってメインクラス/メソッドを認識できるかどうかを確認します - >右クリック - >別のユーザーとして実行 - >実行構成 - >メイン - >検索ボタンをクリックEclipseがJARファイル内のメインクラスを検索できるかどうかを確認します。 →JARファイルがメインクラスへのエントリポイントを持つことを検証するためのものです。

  1. その後、Java DynamicプロジェクトをJARファイルではなく「Runnable JAR」ファイルとしてエクスポートします。

  2. Java起動設定で、メインクラスを選択します。

  3. Jarファイルをエクスポートしたら、下記のコマンドを使用して実行します。 Java -cp [あなたのJAR] .jar [完全なパッケージ] .MainClass例:Java -cp AppleTCRuleAudit.jar com.Apple.tcruleaudit.classes.TCRuleAudit

  4. サポートされていないJavaバージョンエラーが発生する可能性があります。修正方法は、Eclipseでプロジェクトをコンパイルするために使用されるJavaバージョンと一致するように、シェルbashプロファイル内のJava_homeを変更することです。

お役に立てれば!まだ問題があるかどうかをお知らせください。

5
Karthik Pon

Jarが 規則 に従わない場合、それは実行可能jarではありません。

5
John M

任意の実行可能jarファイルをクリックするか、またはJavaのjarプロンプトのapp.jarのようにコマンドプロンプトを使用して実行する必要があります(jarのパスにスペースが含まれる場合は「--jar」C:\ folder name\app.jarを使用)。実行可能jarが実行されていない場合は、正しく作成されていないことを意味します。

よりよく理解するために、jarファイル(またはWindows 7-Zipがいい方の場合は任意のツールを使用して表示)を抽出し、/ META-INF/MANIFEST.MFの下のファイルを確認してください。あなたが好きなエントリを見つけた場合

メインクラス:your.package.name.ClaaswithMain - それで大丈夫です、そうでなければあなたはそれを提供しなければなりません。

MANIFEST.MFファイルにMain-Classエントリを追加することに注意してください、あなたがそれを保存している場所をチェックしてください!

4
Shekh Akther

Jarファイルが正しく作成されていない可能性があります。

ex:jar作成時にオプションmがない

次のように動作します。

jar -cvfm MyJar.jar Manifest.txt *.class
4
satheesh.v

私は個人的にここでのすべての答えは質問を誤解していると思います。これに対する答えは、spring-bootが.jarを作成する方法の違いにあります。 Spring Bootがこのようなマニフェストを設定していることは誰もが知っています。これは誰でもasssumptionとは異なり、これが標準の.jar起動であるかどうかは異なります。

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

おそらくそれはクラスパス上のorg.springframework.boot.loader.JarLauncherで実行する必要がありますか?

4
djangofan

私には、単純なライブラリのjarファイルではなく実行可能なjarファイルが欲しいとEclipseに伝えるのを忘れたために、このエラーが発生しました。 Eclipseでjarファイルを作成するときは、必ず正しいラジオボタンをクリックしてください。

3

この手順に従うだけで簡単にjarファイルを作成できます。

 jar -cfm jarfile-name manifest-filename Class-file name

Jarファイルを実行しながらこのように単純に実行

 Java -cp jarfile-name main-classname
3
Koneri

私は同じ問題を抱えていました。ここで言及した解決策の多くは全体像を私に与えてくれなかったので、私はあなたにコマンドラインからjarファイルをパックするの要約をあなたに与えることを試みます。

  1. .classファイルをパッケージに入れたい場合は、.Javaの先頭にパッケージを追加してください。

    Test.Java

    package testpackage;
    
    public class Test
    {
        ...
    }
    
  2. パッケージ名で与えられた構造で終わる.classファイルを使ってコードをコンパイルするには、次のようにします。

    javac -d . Test.Java
    

    -d .は、コンパイラに必要なディレクトリ構造を作成させます。

  3. .jarファイルをパッケージ化するとき、あなたはそれをどのようにパックするかについてjarルーチンに指示する必要があります。ここではオプションセットcvfePを使います。これは、パッケージ構造を維持する(オプションP)、エントリポイントを指定するで、マニフェストファイルには意味のある情報が含まれます(オプションe)。オプションfはファイル名を指定させ、オプションcはアーカイブを作成し、オプションvは出力を冗長に設定します。ここで注意すべき重要なことはPeです。

    それから私たちが欲しいjarの名前が来ますtest.jar

    それからエントリポイントが来ます。

    その後、そのフォルダからクラスファイルを取得するための-C . <packagename>/が、フォルダ構造を保持したままで渡されます。

    jar cvfeP test.jar testpackage.Test -C . testpackage/
    
  4. Zipプログラムで.jarファイルを確認してください。それは次の構造を持つべきです

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class
    

    MANIFEST.MFには、次のものが含まれています。

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test
    

    マニフェストを手作業で編集する場合は{最後に改行を付けてくださいそれ以外の場合はJavaはそれを認識しません。

  5. .jarファイルをで実行します。

    Java -jar test.jar
    
2
CodeMonkey

上記の答えは私にとって部分的にしか役立たなかった。 Java -cpは回答の一部でしたが、実行するクラスを特定する方法に関するより具体的な情報が必要でした。これは私のために働いたものです:

ステップ1:実行する必要があるクラスを見つける

jar tf /path/to/myjar.jar | more

結果の最上行は以下のとおりです。

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

App.classには、実行するメインクラスが含まれていました。あなたが常にあなたが必要とするクラスが最初のクラスであると仮定することができるかどうか私は100%確信していません、しかしそれは私のためでした。そうでなければ、クラスリストを扱いやすいサイズにするためにgrepを使ってライブラリ関連の結果を除外することはそれほど難しくないと思います。

そこから簡単でした。そのパスを使用します( ".class"サフィックスを除いたもの)。

Java -cp /path/to/myjar.jar somepath/App
2
mwag

MANIFEST.MFを追加したので、このファイルのフィールドの順序を考慮する必要があると思います。私の環境はJava version "1.8.0_91"です

私のMANIFEST.MFはこちら

// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing

// run
~ Java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar

しかし、これは以下のように走る

Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)

//this run swing normally
2
Fan Yer

(最初の投稿 - だからきれいではないかもしれません)

これはOS X 11.6、MavenベースのNetbeans 8.2プログラムに対する私の修正です。今までのところ私のアプリは100%Netbeansです - 微調整はありません(不可能のためにほんの少しのシェルエスケープ!).

ここや他の場所でほとんどすべての答えを試してみた結果、「うまくいくものを使う」というアートに戻りました。

ここでの一番上の答え( olivier-refalo thanx)は始めるのに適した場所のようでしたが、役に立ちませんでした。

うまくいった他のプロジェクトを見て、私はマニフェスト行にいくつかの小さな違いに気づきました:

  1. addClasspath、classpathPrefixが存在しません(それらを削除しました)
  2. mainClassに "com"がありませんでした。 (NB - >プロジェクトのプロパティ - >実行 - >メインクラス - >参照を使って指定します)

理由はわかりません(私はJavaに入って3か月しかありません)。

これは、変更されたマニフェストブロックです。

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>
2
MichaelT

私は悪いマニフェスト生成に対する新しい解決策を見つけました!

  1. WinRARのようなZipエディタでjarファイルを開く
  2. META-INFをクリックして

  3. 追加または編集

    • 追加:

      • META-INFという名前のフォルダーにMANIFEST.MFという名前のテキストファイルを作成し、次の行を追加します。

        • マニフェストバージョン:1.0
        • メインクラス:package.ex.com.views.mainClassName
      • ファイルを保存してZipに追加します

    • 編集する

      • ファイルをドラッグして前の行を追加するためにMANIFEST.MFを変更します。
  4. Cmdを開き、次のように入力します。Java -jar c:/path/JarName.jar

それは今うまくいくはずです!

2
Dave Beauchesne

ほとんどのソリューションはうまくいきませんでしたが、私のインストラクターが私を助けてくれましたここで彼のソリューションを共有したいと思います

javac *.Java
nano MANIFEST.MF

ファイルタイプ

Main-Class:Mainまたはメインファイル名(存在する場合はパッケージ名を追加してください)

jar -cvmf MANIFEST.MF new.jar *.class

今すぐファイルを実行する

Java -jar new.jar

または、ファイルのプロパティに移動して確認できます

プログラムとしてのファイルの実行を許可

それをダブルクリック

上記の答えのほとんどはそうではなかったが、それは私を助けた

1
user10356724

私はこの問題を抱えていて、私は最近NetBeans 8でこれを行うことでそれを解決しました(下の画像を参照)

Netbeans project properties

  1. プロジェクトの properties に移動します。
  2. 実行 をクリックします。
  3. browse を使用してプロジェクトのメインクラスを指定します。
  4. build および run Jarファイル。
1

一点だけ明確にするために

Main-Class: <packagename>.<classname>

あなたがパッケージを持っていないなら、あなたはこのようにその部分を無視しなければなりません:

Main-Class: <classname>
1
Reihan_amn

mANIFEST.MFメインクラス内のjarファイルを確認します。

最初の

class first
{
        public static void main (String arg[ ])
        {
           System.out.println("Welcome to the world of Java");
        }
}

Manifest-Version: 1.0
Created-By: 1.7.0_80 (Oracle Corporation)

[email protected]:~/Documents$ Java -jar first.jar
no main manifest attribute, in first.jar

の後:

Manifest-Version: 1.0
Created-By: 1.7.0_80 (Oracle Corporation)
Main-Class: first

[email protected]:~/Documents$ Java -jar first.jar 
Welcome to the world of Java
0
KARTHIKEYAN.A

私と同じ問題があるかもしれません。 .jarファイルを作成したら、jar xf app.jar META-INF/MANIFEST.MFと書きます。これにより、現在のディレクトリにファイルのコピーが作成され、読めるようになります。それだけのことを言うなら:

マニフェストバージョン:1.0

作成者:1.8.0_51(Oracle Corporation)

そして、 "Main-Class"宣言を含んでいません、それから私はあなたがあなたの問題を見つけたと思います。

私はそれを解決する方法がわかりません、しかし。私はStackOverflowで同じ/類似の問題を抱えている他の人々をチェックしましたが、答えを見つけることができませんでした。しかし、この情報があれば、おそらくもっと良い助けを得ることができます(あなたが私と同じ問題を抱えているという事実を考えると)。

編集:マニフェストファイルを試してみたがうまくいかなかったが、間違いはjarファイルを作成するときにクラスの1つだけを指定することだった。代わりに* .classを書きましたが、現在は機能します。

マニフェストファイルを作成する必要がある理由はわかりませんが。しかし、それが機能する限りは問題ないと思います。

0
Gendarme

コマンドラインを使用して.jarをアセンブルしている場合は、マニフェストファイルを追加せずにメインを指すことができます。例:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(param "e"はそれを行います:TheNameOfClassWithMainMethodはメソッドmain()とapp.jarを持つクラスの名前です - 実行可能な.jarと* .classの名前 - アセンブルするすべてのクラスファイル)

0
Andrey

私はあなたと同じような問題を抱えていましたが、以下に成功した.warファイルを作成するための構文があります: -

jar {cvf} [jarファイル] [マニフェストファイル]

マニフェストJARファイルを作成(c)または更新(u)するとき、マニフェストオペランドはJARファイルのMANIFEST.MFに含まれる属性の名前と値を使用して既存のマニフェストファイルを定義します。 fオプションが '[ 1 ]'の場合は、マニフェストオペランドを指定する必要があります。

マニフェストファイルを作成するには、いくつかの属性に値を定義する必要があります。マニフェストファイルが作成されないように(.WAR)ファイル名の後にアスタリスクを付けることができます。 -

jar -cvf foo.war *

あなたと正直に言うと、それがベストプラクティスであるかどうかわかりませんが、それは私のための仕事です:)。

0
M.87

あなたがたぶんあなたがたいていの場合それを実行する実行可能なjarファイルを必要とするならば、どんなそのような状況でも役立つであろう素晴らしい解決策を見つけました。アプリケーションがIntellij Ideaで実行されている場合は、次の手順に従います。1)モジュール設定、次に成果物に移動し、jarを追加してメインクラスを定義します2)次にメニューの[Build]に移動して[build artifact]をクリックします。 。

これは、ソースフォルダを変更してJavaの代わりにscalaを使用した場合でも機能しました。

0
Ritesh Tyagi