あるアプリケーションをインストールしたのですが、実行しようとすると何も起こりません。コマンドラインから とコマンドラインから実行すると、何も起こりません;
以下のメッセージが表示されます: mainマニフェスト属性がありません;
通常、自分でプログラムを作成した場合、マニフェストファイルにmainクラス属性を追加するはずです。しかしこの場合、ファイルはアプリケーションのものなので、それを行うことはできません。また、jarを抽出してmainクラスが見つかるかどうか試してみましたが、クラスが多すぎて、どのクラスも名前に"main"という単語が入っていません。他のシステムでは問題なく動いているので、これを修正する方法があるはずです。
まず、java -jar app.jar
ではなく、java -jar "app"
を実行しているのがちょっと奇妙です。
次に、jarを実行可能にするには...META-INF/MANIFEST.MFというファイルをjarにする必要がある。
このファイル自体には、(少なくとも)この一行がなければならない:
Main-Class: com.mypackage.MyClass
com.mypackage.MyClass`は、public static void main(String[] args)エントリポイントを保持するクラスです。
CLI、Maven、Ant、Gradleのいずれかを使ってこれを行うには、いくつかの方法があることに注意してください:
CLI**の場合、次のコマンドで実行できます: (tks @dvvrt)
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <インクルードするファイル>;
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>
クレジット マイケル・ニーマンド
グラードル**のために
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
java -jar "app"ではなく、
java -jar app.jar` とすべきだった。
jarオプションは JAR ファイルが実行可能な JAR ファイルである場合にのみ動作します。つまり、JAR ファイルには
Main-Class` 属性を持つマニフェストファイルが必要です。実行可能な JAR を作成する方法については JAR ファイルでのプログラムのパッケージ化 を参照してください。
実行可能なJARでない場合は、以下のような方法でプログラムを実行する必要があります:
java -cp app.jar com.somepackage.SomeClass
ここで、com.somepackage.SomeClass
はプログラムを実行するための main
メソッドを含むクラスです。(com.somepackage.SomeClassは、プログラムを実行するための
main`メソッドを含むクラスです(そのクラスが何であるかはプログラムによって異なります。)
または、以下の例に示すように、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>
この例では、< dependencies />で指定されているすべての依存関係ジャー。セクションは自動的にシングルジャーに含まれます。 jar-with-dependenciesは、含めるjarファイル名に置き換えられるのではなく、文字通りとして配置する必要があることに注意してください。
これは、JavaがMANIFEST.MFファイルでMain属性を見つけられないためです。 Main属性は、アプリケーションのエントリポイントとして使用するクラスをjavaに伝えるために必要です。 jarファイル内では、MANIFEST.MFファイルはMETA-INFフォルダーにあります。 jarファイル内の内容をどのように見ることができるか疑問に思います? WinRARでjarファイルを開きます。
MANIFEST.MF内の主な属性は次のようになります。
Main-Class: <packagename>.<classname>
この行がMANIFEST.MFファイルから欠落している場合、この「メインマニフェスト属性なし」エラーが発生します。
< strike> MANIFEST.MFファイル内でこの属性を指定するのは本当に大きな混乱です。< / strike>。更新:日食でアプリケーションのエントリポイントを指定する本当にきちんとした方法を見つけました。 エクスポートと言うとき。
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.
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>
乾杯。..
IntelliJ IDEAを使用して瓶を作成するときにこの問題がありました。 この議論を参照してください。
それを解決したのは、JARを選択して、jarアーティファクトを再作成することでした>依存関係のあるモジュールから、META-INF / MANIFEST.MFのデフォルトのディレクトリを受け入れません。 -/ src / main / javaから-/ src / main / resourcesに変更します。
それ以外の場合は、jarにマニフェストファイルが含まれていましたが、-/ src / main / javaにあるファイルではありませんでした。
このコマンドを試して、jar :.を含めてください。
java -cp yourJarName.jar your.package..your.MainClass
私も同じ問題を抱えていました。 pomファイルに次の行を追加することで、それは機能しました。 プラグインは、必要なすべての手順でアプリケーションのビルドプロセスを確認します。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
私にとって、どの回答も本当に役に立ちませんでした。メインクラスとすべてを含むマニフェストファイルを正しい場所に配置しました。 私をつまずかせたのはこれでした:
警告:マニフェストを作成しているテキストファイルは必須です。 新しいラインまたはキャリッジリターンで終了します。 最後の行はそうではありません。 新しいラインまたはキャリッジリターンで終了しない場合は、適切に解析されます。
(ソース)。 マニフェストの最後に改行を追加すると、それが修正されました。
今、同じエラーが発生しました。
gradle
を使用している場合は、 gradle.build
に次のものを追加してください。
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'com.company.project.MainClass'
}
}
ここで、「com.company.project.MainClass」は、「public static void main(String [] args)」メソッドを使用して、クラスへのパスです。
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>
私は同じ問題に直面し、それは今修正されています:)。 以下の手順に従ってください。エラーは何にでも発生する可能性がありますが、以下の手順ではプロセスがスムーズになります。 私は修正を見つけるために多くの時間を費やしています。
1.Eclipseを再起動してみてください(Eclipseを使用してJARファイルをビルドしている場合)。 ->実際、これは私のJARファイルの適切なエクスポートに役立ちました。
2.日食の再始動後。, 日食がJavaプロジェクトによってメインクラス/メソッドを認識できるかどうかを確認してください-->。; 右クリック-->。; -->。として実行します。; 構成を実行-->。; メイン-->。; [検索]ボタンをクリックして、日食がJARファイルでメインクラスを検索できるかどうかを確認します。 ->これは、JARファイルがメインクラスへのエントリポイントを持つことの検証用です。
4。 この後、Java DynamicプロジェクトをJARファイルではなく「Runnable JAR」ファイルとしてエクスポートします。
5。 Java起動構成で、メインクラスを選択します。
6。 jarファイルをエクスポートしたら、次のコマンドを使用して実行します。 java -cp [Your JAR] .jar [完全なパッケージ]。メインクラス。 例:java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit。
7。 サポートされていないJavaバージョンのエラーに直面する可能性があります。 修正は、プロジェクトを日食でコンパイルするために使用されるJavaバージョンと一致するように、シェルbashプロファイルのjava_homeを変更することです。
これが役立つことを願っています。! それでも問題があればお知らせください。
私は個人的に、ここでのすべての答えは質問を誤解していると思います。 これに対する答えは、スプリングブートが.jarをどのように構築するかという違いにあります。 Spring Bootがこのようなマニフェストを設定することは誰もが知っています。これは、誰もが仮定とは異なり、これは標準の.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
を使用して実行する必要があります?
私も同じ問題を抱えていました。 ここで述べた解決策の多くは全体像を示していなかったので、コマンドラインからjarファイルをパックする方法の概要を説明します。
1。 。class
ファイルをパッケージにしたい場合は、 。java
の先頭にパッケージを追加します。
** Test.java **。
パッケージテストパッケージ;。
公開クラスのテスト。
{。
...
}。
2。 「.class」ファイルでコードをコンパイルするには、パッケージ名で指定された構造を使用します。
ジャバック-d。 . Test.java。
`-d。 .`コンパイラに必要なディレクトリ構造を作成します。
3。 。jar
ファイルをパッケージ化するときは、jarルーチンに梱包方法を指示する必要があります。 ここでは、オプションセット「cvfeP」を使用します。 これは、パッケージ構造を維持(オプション P
)、エントリポイントを指定して、マニフェストファイルに意味のある情報が含まれるようにします(オプション e
)。 オプション f
ではファイル名を指定でき、オプション c
はアーカイブを作成し、オプション v
は出力を冗長に設定します。 ここで注意すべき重要なことは、「P」と「e」です。
次に、「test.jar」が必要な瓶の名前が表示されます。
次に、エントリポイント< packagename>が表示されます。< classname>。
そして、 `-C。 . < packagename> / `は、そのフォルダーからクラスファイルを取得し、フォルダー構造を維持します。
jar cvfeP test.jar testpackage.Test -C。 . テストパッケージ/。
4。 zipプログラムで 。jar
ファイルを確認します。 次の構造にする必要があります。
** test.jar **。
メタインフ。
| MANIFEST.MF。
テストパッケージ。
| Test.class。
MANIFEST.MFには以下を含める必要があります。
Manifest-Version:1.0。
Created-By:< JDKバージョン> (Oracle Corporation)。
メインクラス:testpackage.Test。
マニフェストを手動で編集する場合は、必ず改行を最後に保管してください**そうしないと、javaはそれを認識しません。
5。 。jar
ファイルを実行します。
java -jar test.jar。
jarファイルを正しく作成していない可能性があります。
ex:jar作成でオプションmが欠落しています。
次の作品:
jar -cvfm MyJar.jar Manifest.txt *.class
実行可能jarファイルjava -jar app.jarなどのコマンドプロンプトを使用してクリックまたは実行して実行する必要があります(「jarのパスにスペースがある場合」を使用します)。 java -jar "C:\ folder name \ app.jar")。 実行可能ジャーが実行されていない場合、つまり、正しく作成されていません。
理解を深めるには、jarファイルを抽出し(または、任意のツールを使用して表示します。Windows7-Zipはすばらしいものです)、/ META-INF / MANIFEST.MFでファイルを確認します。次のようなエントリが見つかった場合。
メインクラス:your.package.name.ClaaswithMain-それで結構です、そうでなければあなたはそれを提供しなければなりません。
MANIFEST.MFファイルにメインクラスのエントリを追加することに注意してください。保存先を確認してください。!