jarファイルを実行できません:「メインのマニフェスト属性がありません」


971

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

java -jar "app.jar"

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

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

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


主な方法を探します。クラス名に依存することはできません。
デイブニュートン

2
わかっていますが、.classファイルしかないので、メソッドを実際に見ることはできません。または私はできますか?
Ewoud

あなたは実際に引用符を入力していませんか?いずれの場合も、メソッドの表示方法はいくつかありますjavap。ただし、jarを展開して、実際にマニフェストがないかどうかを確認することもできます。
Dave Newton

関連:依存関係あり:stackoverflow.com/a/23986765/360211
weston

CommandLineJobRunnerを使用してコードを実行しているときにメインクラスがない場合
Kamini

回答:


946

まず、あなたが走るのを見るのjava -jar "app"ではなく、奇妙なことですjava -jar app.jar

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

ファイル自体には(少なくとも)次の1つのライナーが必要です。

Main-Class: com.mypackage.MyClass

public static void main(String [] args)をcom.mypackage.MyClass保持するクラスはどこにありますかエントリポイントをますか。

CLI、Maven、Ant、Gradleのいずれかでこれを行うにはいくつかの方法があることに注意してください。

CLIは、次のコマンドを実行します:(TKS @ dvvrt jar 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'
        )
    }
}

15
Antでは、<jar>要素内の<manifest> <attribute name = "Main-Class" value = "com.mypackage.MyClass" /> </ manifest>
Michael Niemand

1
ありがとうございました。これを使用してlibフォルダーに依存関係をコピーできることを追加したかっただけです:stackoverflow.com/a/996915/1121497。クラスパスにはそのlibフォルダーが含まれているので、jarを実行するだけでjava -jar myproject.jar、依存関係を見つけることができます。
Ferran Maylinch 2014年

4
「META-INF / MANIFEST.MFというファイルをjarする方法」一方に.jarがあり、もう一方に.MFがあります。それらをどのようにリンクしますか?マニフェストを.jarと同じフォルダに配置しましたが、機能しません。それでも問題が発生します!
Wicelo

4
@Wicelo jarファイルの作成中に特定のMANIFEST.MFファイルを指定するには、jarにmフラグを使用します。例えば。 jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt

1
注:Mavenの場合maven-jar-plugin、VSCで生成されたMavenファイルにアイテムがすでにあるため、<configuration>セクションを追加しただけです。
アーロンフランケ

279

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。(そのクラスが何であるかはプログラムによって異なります。提供された情報から区別することは不可能です)。


3
返信ありがとうございます。ただし、解決策は、メインメソッドを含むクラスの名前がわかっている場合にのみ機能します。そしてそれはタイプミスでした...それは「app.jar」であるはずでした。しかし、ファイルをダブルクリックするだけで他のシステムで実行される理由をどのように説明しますか?
Ewoud、2012年

実際に実行可能なJARである場合は、マニフェストファイルを抽出できます(META-INFJARファイル内のディレクトリにあります)。Main-Classメインクラスの名前を指定する属性が含まれている必要があります。
Jesper

1つのシステムで実行される場合、そのシステムのJavaバージョンが古すぎる可能性があります。たとえば、JARがJava 7でコンパイルされている場合、Java 6以前のシステムでは実行できません。
Jesper

他のシステムはwin7を実行していて、問題のあるこのPCはw​​in8を実行しているので、それはおかしいです。
Ewoud

2
@Jesperこんにちは、Eclipseがデフォルトのパッケージを使用している場合はどうなりますか?クラス名だけ入れますか?
Ogen 14

127

または、以下の例に示すように、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> 

この例では、セクションで指定されたすべての依存jarが自動的に単一のjarに含まれます。jar-with-dependenciesは、含めるjarファイル名で置き換えるのではなく、文字どおりに置く必要があることに注意してください。


3
完璧です、これでうまくいきます。すべての依存関係を1つのjarにバンドルするので、プロジェクトをコンパイル/ビルドしてそのまま使用できます。
ポール

2
シェードプラグインのコンテキストでは、Executable JARのヘルプに従う必要があります。
koppor 2017

3
これでmaven-assembly-pluginうまくいきました。maven-jar-pluginしませんでした。
MartynasJusevičius18年

注:このコードをpom.xmlファイル内に挿入して<build><plugins> PUT IT HERE </plugins></build>から、mavenパッケージを実行します(IDEAで右側のmavenスライドメニューを開き、プロジェクト>ライフサイクル>パッケージを探します)。次に、jarファイルはTargetフォルダーにあります。乾杯!
Kirill Karmazin 2018

私はこの問題に本当に苦労していました...これは完全に機能します。ありがとう!
jmojico

60

これは、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でアプリケーションのエントリポイントを指定するための本当にきちんとした方法を見つけました。エクスポートと言うと

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.

ここに画像の説明を入力してください


32

同じ問題がありました。pomファイルに次の行を追加することで、動作します。プラグインは、必要なすべての手順を使用して、アプリケーションのビルドプロセスを確認します。

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

2
完全に機能しましたが、2018年4月のバージョンの追加を検討してください<plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <version> 2.0.1.RELEASE < / version> </ plugin>
Tenflex

申し訳ありませんが、Spring Bootについて話していないため、解決策ではありません。jarの実行に関する一般的な問題です:)
LAMRIN TAWSRAS

おかげで、これは春のブーツの問題を解決しました!
AleksandarT

私は春のブーツ2.2.0.Releaseに取り組んでいます。残念ながら、このソリューションは私にはうまくいきませんでした。ただし、<parent>...</parent>pom.xmlのアプリケーションから参照した場合は機能します。私の推測では、parentアプリケーションのpom.xmlにアクセスすると、明確なアイデアが得られます。
火曜日

私は最終的にカスタムで私の問題を解決しましたrepackage-classifierdocs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…を
tusar

30

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

apply plugin: 'java'

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

1
これまでの最も簡単な答え。
lasec0203 2017年

29

IntelliJ IDEAを使用してjarを作成するときにこの問題が発生しました。この議論を参照してください。

私にとってそれを解決したのは、jarアーティファクトを再作成し、JAR>依存関係のあるモジュールからを選択しましたが、META-INF / MANIFEST.MFのデフォルトディレクトリを受け入れませんでした。これを-/ src / main / javaから-/ src / main / resourcesに変更します。

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


これはIDEA 14.1.6で私にとってはうまくいきました。pom.xmlのビルドプロパティも追加しましたが、効果がありませんでした。しかし、あなたの答えはそれを解決しました、ありがとう。
lsrom、2016年

3
他の何も機能していないという純粋な欲求不満によってデスクトップがへこむのを防いでくれてありがとう;)リンクが壊れているようですが、これが完全に機能することを確認できます。IntelliJ IDEA 2018.2.5(Community Edition)でテスト
MatthiasBöNov

/ resourcesディレクトリを持っていなくても、これが機能することを確認しました
lxknvlk

28

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>

乾杯...


これはうまくいったことがわかりましたが、実行するmvn package shade:shadeだけでmvn packageシェードプラグインが実行されないため、実行する必要がありました。
レイストーム2017年

24

次のコマンドを試して、jarを含めます。

java -cp yourJarName.jar your.package..your.MainClass

1
1つはpom.xmlにメインクラスを含めてjava -jarコマンドを使用する方法で、もう1つはjava -cpコマンドを使用する方法です。
Gaurav Khare

15

私にとって、どの回答も本当に役に立ちませんでした-Main-Classとすべてを含むマニフェストファイルを正しい場所に置いていました。私をつまずかせたのはこれでした:

警告:マニフェストの作成元のテキストファイルは、改行または改行で終了する必要があります。最後の行が改行または改行で終わっていない場合、最後の行は適切に解析されません。

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


11

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>

3
これはSpring Bootプロジェクトだと誰が言ったのですか?
james.garriss 2017

2
@ james.garrissまあ、私はno main manifest attributeエラーを検索してこの投稿に来ましたが、私は春のブートアプリケーションに取り組んでいるので、この答えは私を助けました。私はすでにMETA-INF/MANIFEST.MFファイルの作成方法を知っていましたが、spring-bootがそれを自動的に処理する方法を知りませんでした。
Vishrant 2018年

5
この回答に反対票を投じる理由は何もありません。使用していない場合はspring-boot無視してください。Stackoverflowは、プログラミング中に直面する独自の課題リポジトリの構築にも役立ちます。
Vishrant 2018年

@Vishrant他の人については知りませんが、この回答は提起された質問に対応していないため、反対票を投じました。たまたまあなたの質問に答えことがあるかもしれませんが、あなたの質問は実際に尋ねられたものではありませんでした。
ベイン

@Baneもちろん。しかし、質問は広い意味で取ることができ、この答えはそれに当てはまり、スプリングブーツを使用するとき、ある意味で他の人を助けることができます。
Vishrant 2018年

10

今日も同じ問題がありました。META-INFをリソースフォルダーに移動すると問題が解決しました。


これも私にとってはうまくいきました。Jetbrains IntelliJ
NickSoft


これは私にとってもintellijでうまくいきました。男ありがとう
Waqas

10

ちょうど今同じエラーが出ました。uを使用している場合gradleは、urに次のものを追加するだけgradle.buildです。

apply plugin: 'java'

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

メソッドcom.company.project.MainClassを使用したurクラスへのパスpublic static void main(String[] args)


これは私を助けました!GradleチュートリアルではトップレベルのmainClassName変数セットを使用して指定していましたが、これはgradle runコマンドでのみ役立ち、実行可能.jarの作成では役立ちません
kevlarr

8

MAVENの問題は、アーティファクトを使用するときに、独自のMANIFEST.MFではなく、依存関係の最初のライブラリから最初のMANIFEST.MFファイルを含めようとすることです。

  1. yourjar.jarの名前をyourjar.zipに変更します。
  2. META-INF \ MANIFEST.MFからMANIFEST.MFファイルを開きます。
  3. MAVENによってプロジェクトですでに生成されている実際のMANIFEST.MFをコピーします。

    Manifest-Version:1.0 Main-Class:yourpacket.yourmainclass(exmaple info.data.MainClassの場合)

  4. youjar.zipのMANIFEST.MFの内容をそれで置き換えます。

  5. yourjar.zipの名前をyourjar.jarに戻します。
  6. これでjava -jar yourjar.jarは完全に機能します。

または!

自分でMANIFEST.MFを作成し、次の手順を実行します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestFile> Your path like: src/main/resources/META-INF/MANIFEST.MF </manifestFile>
            <index>true</index>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
        </archive>
    </configuration>
</plugin>

ただし、mavenパネル(またはmavenコマンドライン)を使用する場合は、強制的に独自のマニフェストを生成してJARファイルに含めることができます。

  1. pom.xmlのビルドセクションに次のコードを追加します。

    <plugins>
        <plugin>
    
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
    
            <archive>
    
                <index>true</index>
    
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass> yourpacket.yourmainclass (for exmaple info.data.MainClass)</mainClass>
                </manifest>
                <manifestEntries>
                    <mode>development</mode>
                    <url>${project.url}</url>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>

  2. MAVENパネルを(Intellijで)開き、「インストール」を実行します。マニフェストファイルを生成し、すべての依存関係を含むJARファイルを「ターゲット」フォルダーにコンパイルします。また、ローカルのmavenリポジトリーにインストールされます。



5

私は同じ問題に直面しましたが、現在は修正されています:)以下の手順に従うだけで、エラーは何にもあてはまる可能性がありますが、以下の手順によりプロセスがスムーズになります。私は修正を見つけるのに多くの時間を費やしています。

1.Eclipseを再起動してみてください(Eclipseを使用してJARファイルをビルドしている場合)->実際、これはJARファイルを正しくエクスポートする際の問題の解決に役立ちました。

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

  1. この後、Java動的プロジェクトをJARファイルではなく「実行可能なJAR」ファイルとしてエクスポートします。

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

  3. jarファイルをエクスポートしたら、以下のコマンドを使用して実行します。java -cp [Your JAR] .jar [complete package] .MainClass例:java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

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

お役に立てれば!問題が解決しない場合はお知らせください。


5

私も同じ問題を抱えていました。ここで説明した解決策の多くでは、全体像がわからなかったので、コマンドラインから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です。

    次に、必要な瓶の名前が表示されます test.jarます。

    次に、エントリポイントが来ます。

    次に-C . <packagename>/、そのフォルダーからクラスファイルを取得し、フォルダー構造を維持します。

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. あなたのチェック .jarzipプログラムでファイルを。次のような構造になっている必要があります

    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

1
回答の4番目のステップは非常に重要です。最後に改行があったため、マニフェストが機能していませんでした。このトピックについて私が訪問したすべての回答(多く)はこれについて言及していませんでした。また、maven、ant、gradleなどを使用していない人には必須です。
Maude

1
@Maudeフィードバックありがとうございます。だからこそ、私が太字で改行のヒントを付けて回答を追加しました。自動生成されたマニフェストと比較して、これがわかるまでの日数を探しました。
CodeMonkey 2018

ああ、ありがとう。私はその改行に頭をぶつけていました。
リチャードトーマス

5

私は個人的に、ここでのすべての答えは質問を誤解していると思います。これに対する答えは、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はクラスパスで実行する必要がありますか?


これは有望に聞こえます。JarLauncherをクラスパスに正確にどのように追加しますか?
MarkHu 2018

4

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

理解を深めるために、jarファイルを抽出(または任意のツールを使用して表示します。Windows7の場合、Zipが適しています)し、/ META-INF / MANIFEST.MFの下のファイルを確認します。次のようなエントリを見つけた場合

Main-Class:your.package.name.ClaaswithMain-それで問題ありません。それ以外の場合は、提供する必要があります。

MANIFEST.MFファイルにMain-Classエントリを追加することに注意してください。保存先を確認してください!


4

あなたは単にこのステップに従うことができますを使用してjarファイルを作成します

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

jarファイルを実行しながら、このように単純に実行します

 java -cp jarfile-name main-classname

4

jarファイルを適切に作成していない可能性があります。

例:jar作成にオプションmがありません

次の作品:

jar -cvfm MyJar.jar Manifest.txt *.class

4

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

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


3

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


3

上記の回答は、私にとって部分的にしか役に立ちませんでした。 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

それは常にファーストクラスではありません。めったに。コマンドラインはである必要がありますjava -cp ... somepackage.App
ローンの侯爵、

2

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

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

これは、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

悪いマニフェスト生成の新しい解決策を見つけました!

  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

ほとんどの解決策は私にとってはうまくいきませんでしたが、私のインストラクターが私に彼の解決策を共有したいと思いました私はここでkali linuxターミナルを使用しましたが、すべてのdebianで問題ないはずです

javac *.java
nano MANIFEST.MF

ファイルタイプ

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

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

ここでファイルを実行します

java -jar new.jar

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

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

それをダブルクリックします

上記の回答のほとんどは役に立たなかったが、それは私を助けた


1

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

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

作成者:1.8.0_51(Oracle Corporation)

"Main-Class"宣言が含まれていない場合、問題が見つかったと思います。

私はそれを解決する方法を知りません。StackOverflowで同じ/類似の問題を持つ他の人をチェックしましたが、答えが見つかりませんでした。ただし、この情報を使用すると、(私と同じ問題があるという事実を踏まえて)いくつかのより良い助けを得ることができます。

編集:私はマニフェストファイルを試してみましたが、機能しませんでしたが、私の間違いは、jarファイルを作成するときにクラスの1つだけに名前を付けることでした。代わりに* .classを作成しましたが、現在は機能します。

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


1

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

Netbeansプロジェクトのプロパティ

  1. プロジェクトのプロパティに移動します
  2. [ 実行 ]をクリックします
  3. browseを使用してプロジェクトのメインクラスを指定します。
  4. Jarファイルをビルドして実行します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.