実行しようとしてもアプリケーションがインストールされています(実行可能jarファイルです)。何も起こりません。私がコマンドラインからそれを実行すると:
Java -jar "app.jar"
次のようなメッセージが表示されます。
"app.jar"にメインマニフェスト属性はありません
通常、自分でプログラムを作成した場合は、マニフェストファイルにメインクラスの属性を追加します。しかし、この場合、ファイルはアプリケーションからのものなので、それはできません。私はまた、メインクラスが見つかるかどうかを調べるためにjarファイルを解凍してみましたが、クラスが多数あり、それらのどれにも「main」という単語が含まれていません。プログラムは他のシステムでも正常に動作するため、これを修正する方法が必要です。
まず、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 @ 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'
)
}
}
それは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
メソッドを含むクラスです。 (そのクラスはプログラムによって異なります。提供した情報からはわかりません)。
あるいは、以下の例に示すように、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ファイルの名前で置き換えられるのではなく、文字通りのように置かれるべきであることに注意してください。
これは、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.
Gradleの答えは、jar/manifest/attributes設定を次のように追加することです。
apply plugin: 'Java'
jar {
manifest {
attributes 'Main-Class': 'com.package.app.Class'
}
}
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>
乾杯...
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>
IntelliJ IDEAを使用してjarファイルを作成するときにこの問題が発生しました。 このディスカッション を参照してください。
私が解決したのは、JAR> From modules to From dependenciesを選択し、META-INF/MANIFEST.MFのデフォルトディレクトリを受け入れずに、jarアーティファクトを再作成することでした。 - /src/main/Javaから - /src/main/resourcesに変更してください。
それ以外の場合は、jarファイルにマニフェストファイルが含まれていましたが、 - /src/main/Javaに含まれているはずのものは含まれていませんでした。
私にとっては、答えのどれも本当に役に立ちませんでした - 私はメインクラスとすべてを含むマニフェストファイルを正しい場所に持っていました。私がつまずいたのはこれです。
警告:マニフェストを作成しているテキストファイルは、改行またはキャリッジリターンで終わる必要があります。最後の行が改行またはキャリッジリターンで終わっていない場合、最後の行は正しく解析されません。
( ソース )。マニフェストの最後に改行を追加して修正しました。
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>
今日も同じ問題がありました。私の問題は、META-INFをresourcesフォルダーに移動することで解決されました。
私は今同じエラーを受けました。もしgradle
を使っているのなら、ur gradle.build
に次のものを追加するだけです。
apply plugin: 'Java'
jar {
manifest {
attributes 'Main-Class': 'com.company.project.MainClass'
}
}
com.company.project.MainClass
はpublic static void main(String[] args)
メソッドを持つurクラスへのパスです。
私は同じ問題に直面し、それは今修正されています:)以下のステップに従うだけでエラーは何のためのものかもしれませんが、以下のステップはプロセスをより円滑にします。私は修正を見つけるために多くの時間を費やします。
1. Eclipseを再起動してみてください(あなたがJARファイルをビルドするためにEclipseを使っているならば) - >実際、これはJARファイルを正しくエクスポートすることにおける私の問題を助けました。
2. Eclipseの再起動後、EclipseがJavaプロジェクトによってメインクラス/メソッドを認識できるかどうかを確認します - >右クリック - >別のユーザーとして実行 - >実行構成 - >メイン - >検索ボタンをクリックEclipseがJARファイル内のメインクラスを検索できるかどうかを確認します。 →JARファイルがメインクラスへのエントリポイントを持つことを検証するためのものです。
その後、Java DynamicプロジェクトをJARファイルではなく「Runnable JAR」ファイルとしてエクスポートします。
Java起動設定で、メインクラスを選択します。
Jarファイルをエクスポートしたら、下記のコマンドを使用して実行します。 Java -cp [あなたのJAR] .jar [完全なパッケージ] .MainClass例:Java -cp AppleTCRuleAudit.jar com.Apple.tcruleaudit.classes.TCRuleAudit
サポートされていないJavaバージョンエラーが発生する可能性があります。修正方法は、Eclipseでプロジェクトをコンパイルするために使用されるJavaバージョンと一致するように、シェルbashプロファイル内のJava_homeを変更することです。
お役に立てれば!まだ問題があるかどうかをお知らせください。
Jarが 規則 に従わない場合、それは実行可能jarではありません。
任意の実行可能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エントリを追加することに注意してください、あなたがそれを保存している場所をチェックしてください!
Jarファイルが正しく作成されていない可能性があります。
ex:jar作成時にオプションmがない
次のように動作します。
jar -cvfm MyJar.jar Manifest.txt *.class
私は個人的にここでのすべての答えは質問を誤解していると思います。これに対する答えは、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
で実行する必要がありますか?
私には、単純なライブラリのjarファイルではなく実行可能なjarファイルが欲しいとEclipseに伝えるのを忘れたために、このエラーが発生しました。 Eclipseでjarファイルを作成するときは、必ず正しいラジオボタンをクリックしてください。
この手順に従うだけで簡単にjarファイルを作成できます。
jar -cfm jarfile-name manifest-filename Class-file name
Jarファイルを実行しながらこのように単純に実行
Java -cp jarfile-name main-classname
私は同じ問題を抱えていました。ここで言及した解決策の多くは全体像を私に与えてくれなかったので、私はあなたにコマンドラインからjarファイルをパックするの要約をあなたに与えることを試みます。
.class
ファイルをパッケージに入れたい場合は、.Java
の先頭にパッケージを追加してください。
Test.Java
package testpackage;
public class Test
{
...
}
パッケージ名で与えられた構造で終わる.class
ファイルを使ってコードをコンパイルするには、次のようにします。
javac -d . Test.Java
-d .
は、コンパイラに必要なディレクトリ構造を作成させます。
.jar
ファイルをパッケージ化するとき、あなたはそれをどのようにパックするかについてjarルーチンに指示する必要があります。ここではオプションセットcvfeP
を使います。これは、パッケージ構造を維持する(オプションP
)、エントリポイントを指定するで、マニフェストファイルには意味のある情報が含まれます(オプションe
)。オプションf
はファイル名を指定させ、オプションc
はアーカイブを作成し、オプションv
は出力を冗長に設定します。ここで注意すべき重要なことはP
とe
です。
それから私たちが欲しいjarの名前が来ますtest.jar
。
それからエントリポイントが来ます。
その後、そのフォルダからクラスファイルを取得するための-C . <packagename>/
が、フォルダ構造を保持したままで渡されます。
jar cvfeP test.jar testpackage.Test -C . testpackage/
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はそれを認識しません。
.jar
ファイルをで実行します。
Java -jar test.jar
上記の答えは私にとって部分的にしか役立たなかった。 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
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
(最初の投稿 - だからきれいではないかもしれません)
これはOS X 11.6、MavenベースのNetbeans 8.2プログラムに対する私の修正です。今までのところ私のアプリは100%Netbeansです - 微調整はありません(不可能のためにほんの少しのシェルエスケープ!).
ここや他の場所でほとんどすべての答えを試してみた結果、「うまくいくものを使う」というアートに戻りました。
ここでの一番上の答え( olivier-refalo thanx)は始めるのに適した場所のようでしたが、役に立ちませんでした。
うまくいった他のプロジェクトを見て、私はマニフェスト行にいくつかの小さな違いに気づきました:
理由はわかりません(私はJavaに入って3か月しかありません)。
これは、変更されたマニフェストブロックです。
<manifest>
<mainClass>mypackage.MyClass</mainClass>
</manifest>
私は悪いマニフェスト生成に対する新しい解決策を見つけました!
META-INFをクリックして
追加または編集
追加:
META-INFという名前のフォルダーにMANIFEST.MFという名前のテキストファイルを作成し、次の行を追加します。
ファイルを保存してZipに追加します
編集する
Cmdを開き、次のように入力します。Java -jar c:/path/JarName.jar
それは今うまくいくはずです!
ほとんどのソリューションはうまくいきませんでしたが、私のインストラクターが私を助けてくれましたここで彼のソリューションを共有したいと思います
javac *.Java
nano MANIFEST.MF
ファイルタイプ
Main-Class:Mainまたはメインファイル名(存在する場合はパッケージ名を追加してください)
jar -cvmf MANIFEST.MF new.jar *.class
今すぐファイルを実行する
Java -jar new.jar
または、ファイルのプロパティに移動して確認できます
プログラムとしてのファイルの実行を許可
それをダブルクリック
上記の答えのほとんどはそうではなかったが、それは私を助けた
私はこの問題を抱えていて、私は最近NetBeans 8でこれを行うことでそれを解決しました(下の画像を参照)
一点だけ明確にするために
Main-Class: <packagename>.<classname>
あなたがパッケージを持っていないなら、あなたはこのようにその部分を無視しなければなりません:
Main-Class: <classname>
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)
sony@sony-VPCEH25EN:~/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
sony@sony-VPCEH25EN:~/Documents$ Java -jar first.jar
Welcome to the world of Java
私と同じ問題があるかもしれません。 .jarファイルを作成したら、jar xf app.jar META-INF/MANIFEST.MF
と書きます。これにより、現在のディレクトリにファイルのコピーが作成され、読めるようになります。それだけのことを言うなら:
マニフェストバージョン:1.0
作成者:1.8.0_51(Oracle Corporation)
そして、 "Main-Class"宣言を含んでいません、それから私はあなたがあなたの問題を見つけたと思います。
私はそれを解決する方法がわかりません、しかし。私はStackOverflowで同じ/類似の問題を抱えている他の人々をチェックしましたが、答えを見つけることができませんでした。しかし、この情報があれば、おそらくもっと良い助けを得ることができます(あなたが私と同じ問題を抱えているという事実を考えると)。
編集:マニフェストファイルを試してみたがうまくいかなかったが、間違いはjarファイルを作成するときにクラスの1つだけを指定することだった。代わりに* .classを書きましたが、現在は機能します。
マニフェストファイルを作成する必要がある理由はわかりませんが。しかし、それが機能する限りは問題ないと思います。
コマンドラインを使用して.jarをアセンブルしている場合は、マニフェストファイルを追加せずにメインを指すことができます。例:
jar cfve app.jar TheNameOfClassWithMainMethod *.class
(param "e"はそれを行います:TheNameOfClassWithMainMethodはメソッドmain()とapp.jarを持つクラスの名前です - 実行可能な.jarと* .classの名前 - アセンブルするすべてのクラスファイル)
私はあなたと同じような問題を抱えていましたが、以下に成功した.warファイルを作成するための構文があります: -
jar {cvf} [jarファイル] [マニフェストファイル]
マニフェストJARファイルを作成(c)または更新(u)するとき、マニフェストオペランドはJARファイルのMANIFEST.MFに含まれる属性の名前と値を使用して既存のマニフェストファイルを定義します。 fオプションが '[ 1 ]'の場合は、マニフェストオペランドを指定する必要があります。
マニフェストファイルを作成するには、いくつかの属性に値を定義する必要があります。マニフェストファイルが作成されないように(.WAR)ファイル名の後にアスタリスクを付けることができます。 -
jar -cvf foo.war *
あなたと正直に言うと、それがベストプラクティスであるかどうかわかりませんが、それは私のための仕事です:)。
あなたがたぶんあなたがたいていの場合それを実行する実行可能なjarファイルを必要とするならば、どんなそのような状況でも役立つであろう素晴らしい解決策を見つけました。アプリケーションがIntellij Ideaで実行されている場合は、次の手順に従います。1)モジュール設定、次に成果物に移動し、jarを追加してメインクラスを定義します2)次にメニューの[Build]に移動して[build artifact]をクリックします。 。
これは、ソースフォルダを変更してJavaの代わりにscalaを使用した場合でも機能しました。