First, it’s kind of weird, to see you run java -jar "app"
and not java -jar app.jar
Second, to make a jar executable… you need to jar a file called META-INF/MANIFEST.MF
the file itself should have (at least) this one liner:
Main-Class: com.mypackage.MyClass
Where com.mypackage.MyClass
is the class holding the public static void main(String[] args) entry point.
Note that there are several ways to get this done either with the CLI, Maven, Ant or Gradle:
For CLI, the following command will do: (tks @dvvrt)
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
For Maven, something like the following snippet should do the trick. Note that this is only the plugin definition, not the full pom.xml:
Latest doc on this plugin: see https://maven.apache.org/plugins/maven-jar-plugin/
<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>
(Pick a <version>
appropriate to your project.)
For Ant, the snippet below should help:
<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>
Credits Michael Niemand —
For Gradle:
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
пытаюсь собрать проект с помощью maven, выдается ошибка no main manifest attribute, in first_project.jar.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>first_project</groupId>
<artifactId>first_project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>firstProject</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mainClass>deleveryClub.MainApp</mainClass>
</properties>
<organization>
<!-- Used as the 'Vendor' for JNLP generation -->
<name>Your Organisation</name>
</organization>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-controls -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-base -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>11.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>deleveryClub.MainApp</mainClass>
</configuration>
</plugin>
<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>deleveryClub.MainApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
ссылка на проект: https://github.com/CptWasp/vk-tester-selenium
-
Вопрос заданболее трёх лет назад
-
24699 просмотров
Здравствуйте!
Скажите пожалуйста, каким IDE вы собираете проект? Если Intellij IDEA, то мне эта проблема уже знакома…
Не раз натыкался на нее… В общем, когда вы собираете jar, то почему-то intellij idea если выбрать create jar from modules & dependencies создает jar некорректно. Эта проблема актуально до последней версии. И соответственно, в jar не попадает папка META-INF И файл MANIFEST.MF
Чтобы это исключить создайте jar — empty
Сама ошибка говорит о том, что в jar файле у вас нет вышеуказанного файла и папки. Тогда заработает корректно.
Также, если это maven || gradle, то положите папку meta-inf на уровень проекта, либо в папку resources. Не в java!
Вот, тут мой ответ по данному вопросу (со скриншотом) — https://stackoverflow.com/questions/1082580/how-to…
Для решения нужно изменить путь до папки с manifest`ом
srcmainjava -> srcmainresources
Картинка
Пригласить эксперта
Вообще-то! Для сведения: при ручной сборке JARа, из cmd строкой:
…>javac -cp «.;test.jar» prog.java,
JAR потом запускается в cmd вот такой строкой: ….>java -cp «.;test.jar» prog
Если же набить команду: ….>java -jar test.jar, то не запустится, И НЕ ДОЛЖЕН!
cmd выдаст такой же результат — no main manifest attribute, хотя, если раззиповать JARник, файл манифеста В НЁМ ЕСТЬ!
-
Показать ещё
Загружается…
07 июн. 2023, в 10:19
20000 руб./за проект
07 июн. 2023, в 10:07
500 руб./за проект
07 июн. 2023, в 08:55
500 руб./за проект
Минуточку внимания
Every executable jar file in a Java application should contain a main method. It is usually placed at the beginning of the application. Manifest files must be included with self-executing jars, as well as being wrapped in the project at the appropriate location, to run a main method. Manifest files have a main attribute that specifies the class having the main method.
“no main manifest attribute” is a common error which happens when we try to run an executable jar
file. The full error output may look like what’s shown below
Unable to execute jar- file: "no main manifest attribute."
Code language: JavaScript (javascript)
Or
no main manifest attribute, in target/exec.jar
In this article, we will show you a few possible fix that you can apply to your Java project to avoid getting “no main manifest attribute” error.
“no main manifest attribute” error message is thrown because of various reasons, but most of the time, it fall under one of the following category.
- Missing entry point of Main-Class in MANIFEST.MF file.
- Missing Maven dependency in
pom.xml
- Missing entry point in
build.gradle
The Main, or Main-Class is an essential attribute to make your jar
executable. It tells Java which class would be used as the entry point of the application.
Without a Main
, or Main-Class
attribute, Java have no way to know which class it should run when you execute the jar
.
Inside the jar
file, the MANIFEST.MF
file is located in META-INF
folder. Opening the jar
file with WinRAR, you would see the contents of it, along with MANIFEST.MF
.
A typical MANIFEST.MF
file should contain the following lines
Manifest-Version: the version of the Manifest file.
Built-By: your PC name.
Build-Jdk: the JDK version installed in your machine.
Created-By: the plugin name used in IDE.
Code language: HTTP (http)
Below is an example of a MANIFEST.MF
file.
Putting maven-jar-plugin in pom.xml
The “no main manifest attribute” error message may occur in a Maven project due to the absence of the Main-Class entry in MANIFEST.MF.
This issue can be resolved by adding maven-jar-plugin
to our pom.xml
file.
<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>
<mainClass>com.linuxpip.AppMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Code language: HTML, XML (xml)
In the code snippet above, com.linuxpip.AppMain
is our fully-qualified name of the Main-Class. You have to change this according to your specific project.
If you need more information, dig deep into maven-jar-plugin
documentation: see https://maven.apache.org/plugins/maven-jar-plugin/
Specify Main-Class in Gradle
The following entries can be put into your build.gradle
file if you receive this error in your Gradle project:
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.linuxpip.MyClass'
)
}
}
Code language: JavaScript (javascript)
In the code snippet above, com.linuxpip.MyClass
is our fully-qualified name of the Main-Class. You have to change this according to your specific project.
Change default MANIFEST.MF folder in IntelliJ IDEA
People have been reporting that IntelliJ IDEA keeps putting the JAR artifact into the wrong folder.
In order to fix “no main manifest attribute” in IntelliJ IDEA, choose JAR > From modules with dependencies
In the Create JAR from Modules window, change the default Directory for META-INF/MANIFEST.MF path from <project folder>srcmainjava
to <project folder>srcmainresources
.
Otherwise it would generate the manifest and including it in the jar, but not the one in <project folder>srcmainjava
that Java expects.
After that, just continue to Build Artifacts as you usually do.
Specify entry point in Eclipse
If you’re exporting the JAR file in Eclipse, it has a built-in option that allows you to specify the Application’s entry point, avoiding “no main manifest attribute” error message.
In Eclipse’s JAR Export window, you would see “Select the class of the application entry point” near the end of the Export process. Now you can pick a class and Eclipse will automatically generate the proper MANIFEST.MF
file with the settings you’ve set.
You’ve built a Java project and packaged a .jar file.
You are ready to run it outside your IDE, or deploy it somewhere.
When you run it using java -jar <your.jar>
it says something like this:
no main manifest attribute, in /src/project/target/your-jar-1.0-SNAPSHOT.jar
How to add a Manifest file
You need to create a META-INF/MANIFEST.MF
file with the following content:
Main-Class: com.mypackage.MyClass
The class name com.mypackage.MyClass
is the main class that has the public static void main(String[] args) entry point in your application.
If you’re using Maven
If using Maven, then you will need to add this to your 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>
If you’re using Gradle
Likewise, if you’re using Gradle, then use this:
plugins {
id 'java'
}
jar {
manifest {
attributes (
'Main-Class': 'com.mypackage.MyClass'
)
}
}
If you didn’t build an Executable Jar
Then you can run it like this:
java -cp app.jar com.mypackage.MyClass
If all else fails: Use this Maven Single Goal
If all else has failed, then you can always use this Maven goal to get the job done:
<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.mypackage.MyClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
In this post, we will see how to solve Unable to execute jar- file: “no main manifest attribute”.
Table of Contents
- Problem
- Solution
- Maven
- Spring boot application
- Gradle
- Maven
- Root cause
Problem
When you have a self-executable jar and trying to execute it. You might get this error.
Unable to execute jar- file: “no main manifest attribute”
Solution
Maven
You might get this error when Main-Class
entry is missing in MANIFEST.MF file. You can put maven-jar-plugin
plugin in pom.xml
to fix it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<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> <mainClass>org.arpit.java2blog.AppMain</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> |
org.arpit.java2blog.AppMain
is a fully qualified name of main class. You need to replace it with your application’s main class.
Run mvn clean install
and then execute the jar file as below.
java —jar AppMain—0.0.1—SNAPSHOT.jar |
AppMain-0.0.1-SNAPSHOT.jar
is application jar that you want to run.
Spring boot application
In case, you are getting an error while running spring boot application, you can solve it with spring-boot-maven-plugin
.
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.0.1.RELEASE</version> </plugin> </plugins> </build> |
Gradle
In case you are using gradle, you can solve this with following entry.
plugins { id ‘java’ } jar { manifest { attributes( ‘Main-Class’: ‘org.arpit.java2blog.AppMain’ ) } } |
Please replace org.arpit.java2blog.AppMain
with your main class.
Root cause
When you run self-executable jar, java will look for the Main-Class
in MANIFEST.MF file located under META-INF folder. If it is not able to find an entry,then it will complain with Unable to execute jar- file: “no main manifest attribute”
.
MANIFEST.MF contains information about files contained in the Jar file.
Manifest—Version: 1.0 Built—By: Arpit Mandliya Build—Jdk: 1.8.0_101 Created—By: Maven Integration for Eclipse |
Once you run the above-mentioned solution and reopen MANIFEST.MF
file in jar again, you will see Main-Class entry.
Manifest—Version: 1.0 Built—By: Arpit Mandliya Build—Jdk: 1.8.0_101 Created—By: Maven Integration for Eclipse Main—Class: org.arpit.java2blog.AppMain |
This should solve Unable to execute jar- file: “no main manifest attribute”. Please comment in case you are still facing the issue.
Problem
Sometimes you face the following error while runing an executable jar :
No main manifest attribute, in “<APP_NAME>.jar”
Solution
- Main-class property is missing on your jars META-INF/MANIFEST.MF. Correct it by adding the following lines to your pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<build> <plugins> <plugin> <!— Build an executable JAR —> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>com.roufid.tutorials.AppTest</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> |
Consider that the the fully qualified name of your Main class is com.roufid.tutorials.AppTest
- Launch a clean install on your application
- Run your executable jar using the following command :
java —jar AppTest—0.0.1—SNAPSHOT.jar
Take time to understand !
Since your are running an executable jar file, Java will look for the manifest MANIFEST.MF located under META-INF/ which contains information about the files packaged.
Java must know the main class to run. This information was missing in the MANIFEST.MF. Below the content of this file before adding the maven-jar-plugin :
Manifest—Version: 1.0 Built—By: Radouane ROUFID Build—Jdk: 1.7.0_79 Created—By: Apache Maven 3.3.3 Archiver—Version: Plexus Archiver |
There is no mention of a Main-Class !
We used maven-jar-plugin to handle jar content and manifest configuration, specially adding a Main-Class property to MANIFEST.MF file to specify the project main class. Below the aim of the property :
- <mainClass>com.roufid.tutorials.AppTest</mainClass>
Is to make our Jar executable. You must set here the fully qualified name of your Main class.
The manifest classpath produced using the above configuration would look like this:
Manifest—Version: 1.0 Built—By: Radouane ROUFID Build—Jdk: 1.7.0_79 Created—By: Apache Maven 3.3.3 Main—Class: com.roufid.tutorials.AppTest Archiver—Version: Plexus Archiver |
References
- Jar manifest file
- Apache Maven JAR Plugin
30 ответов
Во-первых, это странно, если вы запустите java -jar "app"
, а не java -jar app.jar
Во-вторых, чтобы сделать исполняемый файл jar… вам нужно записать файл META-INF/MANIFEST.MF
сам файл должен иметь (по крайней мере) этот один вкладыш:
Main-Class: com.mypackage.MyClass
Где com.mypackage.MyClass — класс, содержащий основную точку статического void main (String [] args).
Обратите внимание, что есть несколько способов сделать это с CLI, Maven или Ant:
Для 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.0.2</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>
Кредиты Майкл Ниманд —
Olivier Refalo
13 март 2012, в 19:14
Поделиться
Это должно быть 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
для запуска программы. (То, что этот класс зависит от программы, невозможно сообщить из предоставленной вами информации).
Jesper
13 март 2012, в 19:22
Поделиться
В качестве альтернативы вы можете использовать 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-with-dependencies должны быть буквально помечены как, а не заменены именами файлов jar, которые вы хотите включить.
CodePlumber
26 дек. 2014, в 23:51
Поделиться
Это потому, что Java не может найти главный атрибут в файле MANIFEST.MF.
Главный атрибут необходим, чтобы указать java, какой класс он должен использовать в качестве точки входа приложения. В файле jar файл MANIFEST.MF находится в папке META-INF. Интересно, как вы могли бы посмотреть, что внутри файла jar? Откройте файл jar с помощью WinRAR.
Основной атрибут внутри 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.
Sasanka Panguluri
29 сен. 2013, в 02:18
Поделиться
Ответ Gradle заключается в том, чтобы добавить параметр jar/manifest/attributes следующим образом:
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'com.package.app.Class'
}
}
QED
10 май 2016, в 00:51
Поделиться
Для maven это то, что его решило (для меня, для кодовой базы Veetle на GitHub):
<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>
Приветствие…
Dave
01 март 2013, в 16:36
Поделиться
Попробуйте эту команду включить банку:
java -cp yourJarName.jar your.package..your.MainClass
Burhan ARAS
23 авг. 2013, в 08:27
Поделиться
Для меня ни один из ответов не помог — у меня был файл манифеста в правильном месте, содержащий Main-Class и все. Что меня смутило:
Предупреждение. Текстовый файл, из которого вы создаете манифест, должен завершите новую линию или возврат каретки. Последняя строка не будет правильно разбирается, если он не заканчивается новой строкой или возвратом каретки.
(источник). Добавление новой строки в конце манифеста зафиксировано.
eis
25 янв. 2015, в 09:20
Поделиться
У меня возникла эта проблема при создании банки с использованием IntelliJ IDEA. См. это обсуждение.
Для меня было решено создать артефакт jar, выбрав JAR > Из модулей с зависимостями, но не принимая каталог по умолчанию для META-INF/MANIFEST.MF. Измените его -/src/main/java на -/src/main/resources.
В противном случае он включал файл манифеста в банке, но не тот, который был в /src/main/java, который должен иметь.
morningstar
09 авг. 2016, в 18:03
Поделиться
Если jar не соответствует правилам, это не исполняемый банку.
John M
13 март 2012, в 19:07
Поделиться
Если вы используете 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>
shuang
23 нояб. 2016, в 21:33
Поделиться
Я столкнулся с той же проблемой, и теперь она исправлена :)
Просто выполните следующие шаги, и ошибка может быть для чего угодно, но нижеследующие шаги делают процесс более плавным. Я трачу много времени, чтобы найти исправление.
1. Перезагрузите Eclipse (если вы используете Eclipse для создания JAR файла)
— > На самом деле это помогло моей проблеме в правильном экспортировании файла JAR.
2. После перезапуска eclipse попытайтесь выяснить, может ли ваше eclipse распознать основной класс/метод по вашему проекту Java → щелкните правой кнопкой мыши → Запустить как → Запустить конфигурации → Главная → нажмите кнопку «Поиск», чтобы узнать, может ли ваше затмение искать ваш основной класс в файле JAR.
— > Это для проверки того, что JAR файл будет иметь точку входа в основной класс.
-
После этого экспортируйте свой Java Dynamic проект как «Runnable JAR», а не JAR файл.
-
В конфигурации запуска Java выберите свой основной класс.
-
После экспорта файла jar используйте следующую команду для выполнения.
java -cp [ваш JAR].jar [полный пакет].MainClass
например: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit -
Вы можете столкнуться с неподдерживаемой ошибкой версии Java. исправление заключается в изменении java_home в вашем профиле оболочки bash в соответствии с версией java, используемой для компиляции проекта в eclipse.
Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас все еще есть проблемы.
Karthik Pon
26 фев. 2016, в 00:03
Поделиться
Для меня эта ошибка произошла просто потому, что я забыл сказать Eclipse, что мне нужен исполняемый файл jar, а не простой файл jar библиотеки. Поэтому, когда вы создаете файл jar в Eclipse, убедитесь, что вы нажимаете правую радиокнопку
Neeraj Bhatnagar
27 нояб. 2015, в 07:52
Поделиться
Возможно, вы не создали файл jar правильно:
ex: отсутствующий параметр m в создании jar
Следующие работы:
jar -cvfm MyJar.jar Manifest.txt *.class
satheesh.v
28 авг. 2013, в 19:30
Поделиться
Любой исполняемый файл jar должен запускаться либо щелчком, либо запуском, используя командную строку, например java -jar app.jar(используйте «если путь jar содержит пробел» — т.е. java -jar «C:имя папки app.jar» ). Если ваша исполняемая банка не запущена, что означает, что она не создана должным образом.
Для лучшего понимания извлеките файл jar (или просмотрите с помощью любого инструмента, для Windows 7-Zip — хороший) и проверьте файл в /META -INF/MANIFEST.MF. Если вы найдете любую запись, например
Main-Class: your.package.name.ClaaswithMain — тогда это хорошо, иначе вы должны его предоставить.
Помните о добавлении записи Main-Class в файле MANIFEST.MF, проверьте, где вы ее сохраняете!
Shekh Akther
03 авг. 2012, в 14:45
Поделиться
У меня была такая же проблема сегодня. Моя проблема была решена с моей движущейся META-INF в папку ресурсов.
RegUser
23 апр. 2017, в 15:02
Поделиться
Вышеуказанные ответы были лишь частично полезными для меня. 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
mwag
21 апр. 2017, в 21:44
Поделиться
Вы можете просто следовать этому шагу
Создайте файл jar с помощью
jar -cfm jarfile-name manifest-filename Class-file name
При запуске jar файла пропустите прогон, как этот
java -cp jarfile-name main-classname
Koneri
28 сен. 2013, в 06:08
Поделиться
У меня такая же ошибка.
Если вы используете 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)
.
Binakot
01 сен. 2017, в 12:02
Поделиться
(первый пост — значит, он не может быть чистым)
Это мое решение для OS X 11.6, основанной на Maven Netbeans 8.2. До сих пор мое приложение на 100% Netbeans — без настройки (всего несколько скинов для невозможного!).
Пробовав большинство ответов здесь и в других местах безрезультатно, я вернулся к искусству «использовать то, что работает».
Верхний ответ здесь (olivier-refalo thanx) выглядел как подходящее место для начала, но не помогло.
Посмотрев на другие проекты, которые действительно работали, я заметил некоторые незначительные отличия в манифестных строках:
- addClasspath, classpathPrefix отсутствовали (удалены)
- В mainClass отсутствовала команда «com». (используется NB → Проект
Свойства- > Выполнить- > Основной класс- > Обзор для указания)
Не уверен, почему (я всего лишь 3 месяца в java) или как, но могу только сказать, что это сработало.
Здесь используется только модифицированный блок манифеста:
<manifest>
<mainClass>mypackage.MyClass</mainClass>
</manifest>
MichaelT
19 июнь 2017, в 20:56
Поделиться
Поскольку вы добавили MANIFEST.MF, я думаю, вы должны рассмотреть порядок поля в этом файле. Мой env 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
Fan Yer
22 март 2017, в 10:35
Поделиться
У меня была та же проблема. Многие решения, упомянутые здесь, не дали мне полной картины, поэтому я попытаюсь дать вам краткое описание того, как упаковать файлы jar из командной строки.
-
Если вы хотите иметь свои файлы
.class
в пакетах, добавьте пакет в начало.java
.Test.java
package testpackage; public class Test { ... }
-
Чтобы скомпилировать ваш код с вашими файлами
.class
в результате структуры, заданной именем пакета, используйте:javac -d . Test.java
-d .
заставляет компилятор создать нужную структуру каталогов. -
При упаковке файла
.jar
вам необходимо проинструктировать процедуру jar о том, как ее упаковать. Здесь мы используем опцию setcvfeP
. Это сохранить структуру пакета (опцияP
), указать точку входа, чтобы файл манифеста содержал содержательную информацию (опцияe
). Опцияf
позволяет указать имя файла, опцияc
создает архив, а опцияv
устанавливает вывод в подробный. Здесь важными являютсяP
иe
.Затем появляется имя флага, в котором мы хотим
test.jar
.Затем появляется точка входа.
И затем приходит
-C . <packagename>/
, чтобы получить файлы классов из этой папки, сохраняя структуру папок.jar cvfeP test.jar testpackage.Test -C . testpackage/
-
Проверьте файл
.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
CodeMonkey
20 янв. 2017, в 07:26
Поделиться
Я лично считаю, что все ответы здесь неверно понимают вопрос. Ответ на это заключается в различии того, как spring -boot создает .jar. Всем известно, что Spring Boot устанавливает такой манифест, который отличается от allones 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
в пути к классам?
djangofan
27 окт. 2017, в 18:58
Поделиться
Просто, чтобы ясно указать на
Main-Class: <packagename>.<classname>
Если у вас нет пакета, вы должны игнорировать эту часть, например:
Main-Class: <classname>
Reihan_amn
22 сен. 2017, в 22:37
Поделиться
У меня была эта проблема, и я решил ее недавно, сделав это в Netbeans 8 (см. изображение ниже):
- перейдите в свойства вашего проекта.
- нажмите Запустить.
- укажите основной класс вашего проекта с помощью просмотра.
- построить и запустить файл Jar.
Abdelsalam A. Shahlol
01 фев. 2017, в 06:42
Поделиться
У меня была такая же проблема, как и вы,
ниже синтаксиса для успешного создания файла .war: —
jar {cvf} [jar-file] [файл-манифест]
манифеста При создании (c) или обновлении (u) файла JAR операнд манифеста определяет существующие файлы манифеста с именами и значениями атрибутов, которые должны быть включены в файл MANIFEST.MF в файле JAR. Описанный операнд должен быть указан, если параметр f присутствует. [1] ‘.
Чтобы создать файл манифеста, вам нужно определить значение для некоторых атрибутов, вы можете поместить звездочку после имени файла (.WAR), чтобы избежать создания файла манифеста: —
jar -cvf foo.war *
Честно говоря, я не знаю, является ли это лучшей практикой, но это делает для меня работу:).
M.87
28 дек. 2016, в 13:55
Поделиться
проверьте свой файл jar внутри MANIFEST.MF Main-Class доступен или нет
first.java
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
KARTHIKEYAN.A
04 дек. 2016, в 01:45
Поделиться
Если вы используете командную строку для сборки .jar, можно указать на main без добавления файла манифеста. Пример:
jar cfve app.jar TheNameOfClassWithMainMethod *.class
(param «e» делает это: TheNameOfClassWithMainMethod — это имя класса с методом main() и app.jar — имя исполняемого файла .jar и *.class — просто все файлы классов для сборки)
Andrey
20 нояб. 2016, в 01:52
Поделиться
Проверьте локальную директорию .m2 для подкаталога этого артефакта.
Если exixts — удалить его и снова выполнить обновление Maven
dushkin
05 июль 2016, в 14:28
Поделиться
У вас может быть такая же проблема, как у меня. Создав файл .jar, напишите jar xf app.jar META-INF/MANIFEST.MF
. Это создаст копию файла в ваш текущий каталог, чтобы вы могли его прочитать. Если он говорит только что-то вроде:
Манифест-версия: 1.0
Создано: 1.8.0_51 (Oracle Corporation)
и не содержит объявления «Main-Class», тогда я думаю, что вы нашли свою проблему.
Я не знаю, как это решить. Я проверил других людей с одинаковыми/похожими проблемами в StackOverflow и не смог найти ответ. Однако с этой информацией вы можете получить некоторую помощь (учитывая тот факт, что у вас есть такая же проблема, как и я).
Изменить: я попытался с файлом манифеста, но не получил его на работу, но моя ошибка заключалась в том, чтобы назвать только один из классов при создании jar файла. Я написал *.class, и теперь он работает.
Хотя я не знаю, почему существует необходимость создания файла манифеста. Но я думаю, это прекрасно, пока оно работает.
Gendarme
17 нояб. 2015, в 23:39
Поделиться
Ещё вопросы
- 0Написание функции в php
- 0C ++ скопировать #define в массив символов
- 1ошибка при попытке использовать keras.utils.plot_model
- 0выбрать все товары из дочерних категорий в родительской категории
- 0Поддержка Knex для чтения реплик
- 1Почему действие возвращается к предыдущему, когда я получаю данные из базы данных?
- 0ng-options & ng-repeat: почему угловая модель не привязана?
- 1Как исправить «java.io.IOException: чтение не удалось, сокет может быть закрыт или истекло время ожидания» при попытке подключения к сопряженному устройству?
- 0PHP вставить массив входных данных, используя foreach
- 1Как преобразовать дату, которую пользователь выбирает в формате MM-дд-гггг, в формат гггг-мм-дд в Java
- 1Chrome как отключить ключевое слово отладчика или отключить паузу
- 1Сохранение стилей при замене слов в python-docx
- 1Почему я получаю AccessControlException: доступ запрещен при добавлении BouncyCastleProvider в сервлет Security in Tomcat
- 1Частичное переопределение метода: как?
- 0Перечисление данных медленно в codeigniter
- 1Как получить разные цвета для разных диапазонов значений в простых линейных графиках Google?
- 1Примените UDF к подмножествам pyspark dataframe
- 1Изображение Angular 4 не найдено в templateURL, но работает в строке шаблона
- 1CSV писать альтернативные пробелы в строках внутри цикла Python
- 1Как сравнить Resultset.getString () с String в Java?
- 0Я хочу получать вложения в электронное письмо от формы
- 1Чудновская формула в питоне
- 1Обновление данных из Vuex дает бесконечный цикл в watcher
- 0Выпадающее меню CSS3 при наведении на размер
- 1Импортировать модуль из родительского каталога в пакетах
- 0Добавить данные реляционного запроса в основной результат JSON
- 1Не удается создать узел cq, когда включен компонент CQ5
- 0Laravel 5.4 Вызов функции-члена attach () в null при вставке в сводную таблицу
- 0удалить регистр из идентификатора элемента перед добавлением правила?
- 0Изменяемая ручка блокирует перетаскиваемое взаимодействие
- 0C ++ указатели или память
- 1Как проверить все флажки в списке флажков при первой загрузке страницы?
- 1Значения атрибутов привязки данных к комбинированному списку
- 0_DEBUG и LLVM 5.0 C ++: ожидаемое значение препроцессора в выражении
- 1Обобщения Java с любым типом <?>
- 1Как поставить задержку для функции в JavaScript? [Дубликат]
- 1Редактирование текстового средства просмотра текста для всех редактируемых текстов в просмотре списка
- 1Передача значения со страницы в Html.ActionLink
- 0Как плавно анимировать, настраивать цвет и управлять индикатором выполнения jQuery UI?
- 0Вставка выбранного значения из заполненного MySQL выпадающего
- 0Как отредактировать значение 3 метки после нажатия на HREF с Javascript?
- 0HTML включен боковое меню мешает междустрочный интервал
- 0Элементы таблицы и неупорядоченные списки нельзя просматривать должным образом во всех версиях Internet Explorer
- 0Обновление JQuery до более новой версии, но какой?
- 1генерировать случайное число с плавающей точкой в C #
- 1Число больше 9 начинается сверху и остается там
- 1Grid View Row Команда Событие Пост Назад
- 1Замена всех элементов, кроме последнего, в определенных строках 2D-массива
- 1Экспорт таблицы Excel с сервера в JavaScript
- 0MVC 3 Вставить строковый HTML-код, используя jquery