Вопрос-ответ

Can't execute jar- file: "no main manifest attribute"

Не удается выполнить jar- файл: "нет главного атрибута манифеста"

Я установил приложение, и когда я пытаюсь запустить его (это исполняемый файл jar), ничего не происходит. Когда я запускаю его из командной строки с помощью:


java -jar "app.jar"


Я получаю следующее сообщение:


нет главного атрибута манифеста в "app.jar"


Обычно, если бы я создал программу сам, я бы добавил атрибут main class в файл манифеста. Но в этом случае, поскольку файл взят из приложения, я не могу этого сделать. Я также попытался извлечь jar, чтобы посмотреть, смогу ли я найти основной класс, но классов слишком много, и ни в одном из них нет слова "main" в названии. Должен быть способ исправить это, потому что программа отлично работает в других системах.

Переведено автоматически
Ответ 1

Во-первых, немного странно видеть, что вы запускаете java -jar "app" и не java -jar app.jar

Во-вторых, чтобы сделать jar исполняемым файлом... вам нужно создать jar-файл с именем META-INF/MANIFEST.MF

сам файл должен содержать (по крайней мере) эту строку:

Main-Class: com.mypackage.MyClass

Где com.mypackage.MyClass - класс, содержащий общедоступную статическую 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:

Последняя документация по этому плагину: см. 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>

(Выберите <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>

Credits Michael Niemand -

Для Gradle:

plugins {
id 'java'
}

jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
Ответ 2

Это должно было быть 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

В качестве альтернативы вы можете использовать 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-with-dependencies следует буквально указывать как, а не заменять именами файлов jar, которые вы хотите включить.

Ответ 4

Это потому, что Java не может найти главный атрибут в файле MANIFEST.MF . Главный атрибут необходим, чтобы указать Java, какой класс она должна использовать в качестве точки входа приложения. Внутри jar-файла файл MANIFEST.MF находится в папке META-INF . Интересно, как вы могли бы посмотреть, что находится внутри jar-файла? Откройте jar-файл с помощью WinRAR.

Главный атрибут внутри MANIFEST.MF выглядит следующим образом:

Main-Class: <packagename>.<classname>

Вы получаете ошибку "нет главного атрибута манифеста", когда эта строка отсутствует в файле MANIFEST.MF.

Указывать этот атрибут внутри файла MANIFEST.MF - это действительно огромная путаница.

Обновить


Я только что нашел действительно удобный способ указать точку входа приложения в Eclipse :


  1. Выберите Файл> Экспорт..

  2. Выберите JAR-файл, затем следующий

  3. Дайте ему имя в следующем окне, затем Next

  4. Снова выберите Next

  5. Вы увидите "Выберите класс точки входа приложения", просто выберите класс, и Eclipse автоматически создаст для вас классный MANIFEST.MF.

введите описание изображения здесь

java jar