Не могу выполнить jar-файл: "нет основного атрибута манифеста" - PullRequest
798 голосов
/ 13 марта 2012

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

java -jar "app.jar"

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

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

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

Ответы [ 34 ]

778 голосов
/ 13 марта 2012

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

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

сам файл должен иметь (как минимум) этот один вкладыш:

Main-Class: com.mypackage.MyClass

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

Для Муравей должен помочь приведенный ниже фрагмент кода:

<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>

Кредиты Майкл Ниманд -

Для Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}
238 голосов
/ 13 марта 2012

Это должно было быть 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 для запуска программы. (Что это за класс, зависит от программы, из информации, которую вы предоставили, узнать невозможно).

99 голосов
/ 27 декабря 2014

Кроме того, вы можете использовать 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, которые вы хотите включить.

58 голосов
/ 29 сентября 2013

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

Основной атрибут внутри MANIFEST.MF выглядит так:

Main-Class: <packagename>.<classname>

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

Указывать этот атрибут внутри файла MANIFEST.MF действительно сложно.

Обновление: я только что нашел очень удобный способ указать точку входа приложения в затмении. Когда вы говорите, Экспорт,

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.

enter image description here

28 голосов
/ 10 мая 2016

Ответ Gradle - добавить настройку jar / manifest / attribute, например:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
24 голосов
/ 23 августа 2013

Попробуйте эту команду, чтобы включить банку:

java -cp yourJarName.jar your.package..your.MainClass
24 голосов
/ 01 марта 2013

Для 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>

Приветствия ...

21 голосов
/ 09 августа 2016

У меня была эта проблема при создании фляги с использованием IntelliJ IDEA. См. это обсуждение .

Для меня это решило воссоздать артефакт jar, выбрав JAR> Из модулей с зависимостями, но не принимая каталог по умолчанию для META-INF / MANIFEST.MF. Измените его с - / src / main / java на - / src / main / resources.

В противном случае это был файл манифеста в jar, но не тот, который должен быть в - / src / main / java.

20 голосов
/ 23 марта 2018

У меня была такая же проблема.добавив следующие строки в файл pom, он заработал.Плагин обеспечит процесс сборки вашего приложения всеми необходимыми шагами.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
12 голосов
/ 25 января 2015

Для меня ни один из ответов на самом деле не помог - у меня был файл манифеста в правильном месте, содержащий Main-Class и все остальное. Что сбило меня с толку, так это:

Предупреждение. Текстовый файл, из которого вы создаете манифест, должен конец новой строкой или возврат каретки. Последняя строка не будет правильно проанализирован, если он не заканчивается новой строкой или возвратом каретки.

( источник ). Добавление новой строки в конце манифеста исправило его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...