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

971

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

java -jar "app.jar"

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

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

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

Ewoud
источник
Ищите основные методы; Вы не можете полагаться на имена классов.
Дэйв Ньютон,
2
Я знаю, но так как у меня есть только файлы .class, я не могу увидеть методы. Или я могу?
Ewoud
Вы на самом деле не печатаете кавычки? В любом случае, есть несколько способов увидеть методы, включая использование javap. Возможно, вы захотите распаковать его и посмотреть, нет ли на самом деле манифеста.
Дэйв Ньютон,
Связанный: с зависимостями: stackoverflow.com/a/23986765/360211
Уэстон
Что делать, если у меня нет основного класса, так как я запускаю код с помощью CommandLineJobRunner
Камини

Ответы:

946

Во-первых, странно видеть, что ты бежишь, 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 или 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>

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

Для Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}
Оливье Рефало
источник
15
В Ant его <manifest> <attribute name = "Main-Class" value = "com.mypackage.MyClass" /> </ manifest> в элементе <jar>
Майкл Ниманд,
1
Спасибо. Просто хотел добавить, что вы можете копировать зависимости в папку lib, используя это: stackoverflow.com/a/996915/1121497 . Поскольку classpath включает эту libпапку, вам нужно только выполнить JAR с, java -jar myproject.jarи он найдет зависимости.
Ферран Майлинч
4
КАК «разархивировать файл с именем META-INF / MANIFEST.MF»? У меня есть .jar с одной стороны и .MF с другой, как их связать? Я поместил манифест в ту же папку, что и файл .jar, но он не работает. У меня все еще есть проблема!
Wicelo
4
@Wicelo Чтобы указать конкретный файл MANIFEST.MF при создании файла jar, используйте флаг m для jar. например. jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt
1
Примечание. Для Maven у меня уже был maven-jar-pluginэлемент в сгенерированном VSC файле Maven, поэтому я просто добавил в него <configuration>раздел.
Аарон Франке
280

Это должно было быть 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
источник
3
спасибо за ваш ответ, но ваше решение работает, только если я знаю имя класса, который содержит метод main. И это была опечатка ... Это должен был быть "app.jar". Но как объяснить, почему он работает в других системах, просто дважды щелкнув файл?
Ewoud
Если это действительно исполняемый файл JAR, вы можете извлечь файл манифеста (он находится в META-INFкаталоге внутри файла JAR). Он должен содержать Main-Classатрибут, который дает вам имя основного класса.
Джеспер
Если он не работает в одной системе, то эта система может иметь слишком старую версию Java. Если JAR, например, скомпилирован с Java 7, вы не сможете запустить его в системе с Java 6 или более ранней версией.
Джеспер
Это забавно, так как другая система работает под управлением Win7, а этот компьютер с проблемами запускает Win8.
Ewoud
2
@Jesper Здравствуйте, а что если eclipse использует пакет по умолчанию? Я просто поставил название класса?
Оген
127

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

CodeBrew
источник
3
Отлично, это работает. Он объединяет все зависимости в один jar, что позволяет вам скомпилировать / собрать проект и запустить его из коробки.
Пол
2
В контексте плагина затенения , нужно следовать за помощью в исполняемом JAR .
Коппор
3
Это maven-assembly-pluginсработало. maven-jar-pluginне.
Мартинас Юсявичюс
Примечание: поместите этот код в свой pom.xmlфайл внутри, <build><plugins> PUT IT HERE </plugins></build>а затем выполните maven Package (в IDEA откройте скользящее меню maven справа, найдите проект> Lifecycle> package). Тогда ваш файл jar будет в папке Target. Ура!
Кирилл Кармазин
Я действительно боролся с этой проблемой ... Это прекрасно работает. Спасибо!
jmojico
60

Это потому, что Java не может найти атрибут Main в файле MANIFEST.MF. Атрибут Main необходим для указания 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.

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

Сасанка Пангулури
источник
32

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

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
Нага Срину Капусетти
источник
2
работал отлично, но подумайте о добавлении версии по состоянию на апрель 2018 года <plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> <версия> 2.0.1.RELEASE < / version> </ plugin>
Tenflex
Извините, но это не решение, потому что он не говорит о Spring Boot, это общая проблема с выполнением фляги :)
LAMRIN TAWSRAS
Большое спасибо, это решило проблему весенней загрузки!
AleksandarT
Я работаю над весенней загрузкой 2.2.0. К сожалению, это решение не сработало для меня. Тем не менее, это работает, когда вы ссылались из <parent>...</parent>приложения в pom.xml. Я предполагаю, что если мы посетим parentpom.xml приложения, мы получим четкое представление.
тусар
Я наконец решил свою проблему с обычаем repackage-classifier. Пожалуйста, посетите docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…
tusar
30

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

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}
QED
источник
1
самый простой ответ на данный момент.
lasec0203
29

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

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

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

Утренняя звезда
источник
Это сработало для меня с IDEA 14.1.6. Я также добавил свойство сборки для pom.xml, но это не имело никакого эффекта. Но твой ответ решил, спасибо.
lsrom
3
Спасибо за то, что спас мой рабочий стол от вмятин от чистого разочарования от того, что больше ничего не работает;) Ваша ссылка кажется неработающей, но я могу подтвердить, что это работает отлично. Протестировано с IntelliJ IDEA 2018.2.5 (Community Edition)
Matthias Bö
подтвердил, что это работает, хотя у меня нет каталога / resources
lxknvlk
28

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

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

Дейв
источник
Я обнаружил, что это работает, но я должен был выполнить, так как mvn package shade:shadeпросто запуск mvn packageне запускал плагин Shade.
Raystorm
24

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

java -cp yourJarName.jar your.package..your.MainClass
Бурхан АРАС
источник
1
Один из способов - включить основной класс в pom.xml и использовать команду java -jar, другой - использовать команду java -cp.
Гаурав Кхаре
15

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

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

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

эйс
источник
11

Если вы используете 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>
шуан
источник
3
Кто сказал, что это проект Spring Boot?
james.garriss
2
@ james.garriss хорошо, я бы сказал, я пришел к этому сообщению в поисках no main manifest attributeошибки, но я работаю над приложением весенней загрузки, поэтому этот ответ помог мне. Я уже знал, как создать META-INF/MANIFEST.MFфайл, но не как заставить Spring-Boot автоматически обрабатывать его.
Вишрант
5
Я не вижу причин для того, чтобы опровергать этот ответ. Если вы не используете, spring-bootпросто игнорируйте это. Stackoverflow также помогает создать собственный репозиторий проблем, с которым вы сталкиваетесь при программировании.
Вишрант
@Vishrant Я не знаю о других, но я понизил голос, потому что этот ответ не касается вопроса, как он был задан. Возможно, только что произошло, чтобы ответить на ваш вопрос, но ваш вопрос был не совсем тем, что задавали.
Бэйн
@ Бэйн уверен. но вопрос может быть взят в широком смысле, и этот ответ применим к нему и может помочь другим в том смысле, когда они будут использовать пружинную загрузку.
Вишрант
10

У меня была такая же проблема сегодня. Моя проблема была решена моим перемещением META-INF в папку ресурсов.

MTA
источник
Это сработало и для меня. Попробуйте, если вы используете Jetbrains IntelliJ
NickSoft
Спасибо, что действительно сработал для меня :)
Сайед Мехтаб Хасан
У меня это тоже сработало на интеллигенции. Спасибо, мужик.
Waqas
10

Я получил ту же ошибку только сейчас. Если вы используете 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)методом.

Binakot
источник
Это помогло мне! В руководствах gradle было указано использование mainClassNameнабора переменных верхнего уровня , но это помогает только с gradle runкомандой, а не с созданием исполняемого файла .jar
kevlarr
8

Проблема MAVEN в том, что он пытается включить первый файл MANIFEST.MF из первой библиотеки из зависимостей вместо НАШЕГО МАНИФЕСТА.MF, КОГДА ВЫ ИСПОЛЬЗУЕТЕ ИЗДЕЛИЯ! ,

  1. Переименуйте yourjar.jar в yourjar.zip
  2. Откройте файл MANIFEST.MF из META-INF \ MANIFEST.MF
  3. Скопируйте настоящий файл MANIFEST.MF, который уже сгенерирован в вашем проекте MAVEN.

    Manifest-версия: 1.0 Main-Class: yourpacket.yourmainclass (например, info.data.MainClass)

  4. Замените им содержимое файла MANIFEST.MF из youjar.zip.

  5. Переименуйте yourjar.zip в yourjar.jar обратно.
  6. Теперь java -jar yourjar.jar работает отлично.

ИЛИ!

Просто создайте свой собственный MANIFEST.MF и:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestFile> Your path like: src/main/resources/META-INF/MANIFEST.MF </manifestFile>
            <index>true</index>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
        </archive>
    </configuration>
</plugin>

Но если вы используете панель maven (или командную строку maven), вы можете заставить ее сгенерировать собственный манифест и включить его в файл JAR.

  1. Добавьте в раздел сборки you pom.xml этот код:

    <plugins>
        <plugin>
    
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
    
            <archive>
    
                <index>true</index>
    
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass> yourpacket.yourmainclass (for exmaple info.data.MainClass)</mainClass>
                </manifest>
                <manifestEntries>
                    <mode>development</mode>
                    <url>${project.url}</url>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>

  2. Откройте панель MAVEN (в Intellij) и выполните «Установить». Он сгенерирует файл MANIFEST и скомпилирует свойство JAR-файл со всеми зависимостями в папку «Target». Также он будет установлен в локальный репозиторий maven.

Юрий Финченко
источник
5

Я столкнулся с той же проблемой, и теперь она исправлена ​​:) Просто выполните следующие шаги, и ошибка может быть для чего угодно, но следующие шаги делают процесс более плавным. Я трачу много времени, чтобы найти решение.

1. Попробуйте перезапустить Eclipse (если вы используете Eclipse для создания файла JAR) -> На самом деле это помогло моей проблеме в правильном экспорте файла JAR.

2.После перезапуска затмения попробуйте посмотреть, сможет ли ваше затмение распознать основной класс / метод по вашему Java-проекту -> щелкните правой кнопкой мыши -> Выполнить как -> Выполнить настройки -> Основные -> нажмите кнопку Поиск чтобы увидеть, может ли ваше затмение найти ваш основной класс в файле JAR. -> Это для проверки того, что JAR-файл будет иметь точку входа в основной класс.

  1. После этого экспортируйте ваш проект Java Dynamic как файл «Runnable JAR», а не файл JAR.

  2. В конфигурации запуска Java выберите свой основной класс.

  3. После экспорта файла jar используйте приведенную ниже команду для выполнения. java -cp [Ваш JAR] .jar [полный пакет]. Основной класс, например: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. Вы можете столкнуться с ошибкой неподдерживаемой версии Java. исправление заключается в изменении java_home в вашем профиле оболочки оболочки в соответствии с версией java, используемой для компиляции проекта в eclipse.

Надеюсь это поможет! Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо проблемы.

KarthikPon
источник
5

У меня такая же проблема. Многие из упомянутых здесь решений не дали мне полной картины, поэтому я постараюсь дать вам краткую информацию о том, как упаковать файлы JAR из командной строки .

  1. Если вы хотите, чтобы ваши .classфайлы были в пакетах, добавьте пакет в начале .java.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. Чтобы скомпилировать код с .classфайлами, заканчивающимися структурой, заданной именем пакета, используйте:

    javac -d . Test.java

    -d .Делает компилятор создать структуру каталогов вы хотите.

  3. При упаковке .jarфайла вы должны указать рутине jar, как его упаковать. Здесь мы используем набор опций cvfeP. Это необходимо для сохранения структуры пакета (опция P), укажите точку входа, чтобы файл манифеста содержал значимую информацию (опция e). Опция fпозволяет указать имя файла, опция cсоздает архив, а опция vустанавливает подробный вывод. Важные вещи, чтобы отметить здесь Pи e.

    Затем идет название банки, которую мы хотим test.jar.

    Затем наступает точка входа.

    И затем приходит, -C . <packagename>/чтобы получить файлы классов из этой папки, сохраняя структуру папки.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. Проверьте ваш .jarфайл в программе zip. Он должен иметь следующую структуру

    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 не распознает его.

  5. Запустите ваш .jarфайл с

    java -jar test.jar
CodeMonkey
источник
1
4-й шаг вашего ответа очень важен! Мой манифест не работал из-за той новой строки в конце, которую я не знал, что должен был поставить. Все ответы, которые я посетил по этой теме (много), не упоминали об этом, и это обязательно для всех, кто не использует maven, ant, gradle и так далее.
Мод
1
@ Мод спасибо за отзыв. Именно поэтому я добавил ответ с подсказкой новой строки жирным шрифтом . Я искал несколько дней, пока не узнал об этом, сравнив с автоматически сгенерированным манифестом.
CodeMonkey
Ха, спасибо. Я просто бился головой об этой новой строке.
Ричард Томас
5

Я лично думаю, что все ответы здесь - неправильное понимание вопроса. Ответ заключается в том, как Spring-Boot создает .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помощью classpath?

djangofan
источник
Это звучит многообещающе. Как именно вы добавляете JarLauncher в путь к классам?
MarkHu
4

Любой исполняемый jar-файл должен запускаться нажатием или запуском с использованием командной строки, например java -jar app.jar (используйте «если путь к jar содержит пробел» - т.е. java -jar «C: \ имя папки \ app.jar»). Если ваш исполняемый файл jar не запущен, это означает, что он создан неправильно.

Для лучшего понимания извлеките файл jar (или просмотрите с помощью любого инструмента, для Windows 7-Zip это хорошо) и проверьте файл в /META-INF/MANIFEST.MF. Если вы найдете какую-либо запись, как

Main-Class: your.package.name.ClaaswithMain - тогда все в порядке, в противном случае вы должны предоставить его.

Помните о добавлении записи Main-Class в файл MANIFEST.MF, проверьте, где вы ее сохраняете!

Шех актер
источник
4

Вы можете просто выполнить этот шаг. Создайте JAR-файл, используя

 jar -cfm jarfile-name manifest-filename Class-file name

Запустив файл jar, просто запустите

 java -cp jarfile-name main-classname
Koneri
источник
4

Возможно, вы не создали файл JAR должным образом:

пример: отсутствует опция m при создании jar

Следующие работы:

jar -cvfm MyJar.jar Manifest.txt *.class
satheesh.v
источник
4

Если вы используете командную строку для сборки .jar, то можно указать на главное без добавления файла манифеста. Пример:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(параметр «e» делает это: TheNameOfClassWithMainMethod - это имя класса с методом main () и app.jar - имя исполняемого файла .jar и * .class - только файлы всех классов для сборки)

Андрей
источник
3

Для меня эта ошибка произошла просто потому, что я забыл сказать Eclipse, что мне нужен исполняемый jar-файл, а не простой jar-файл библиотеки. Поэтому, когда вы создаете JAR-файл в Eclipse, убедитесь, что вы нажимаете правую кнопку-переключатель.

Нирадж Бхатнагар
источник
3

Приведенные выше ответы были только частично полезны для меня. 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
источник
Это не всегда первый класс. Практически нет. Командная строка должна быть java -cp ... somepackage.App.
Маркиз Лорн
2

Поскольку вы добавили 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
Фан Йер
источник
А? Заказ не имеет значения. Непонятно, на что вы претендуете.
Маркиз Лорн
2

(первый пост - поэтому он может быть не чистым)

Это мое исправление для OS X 11.6, программы Netbeans 8.2 на основе Maven. До сих пор мое приложение на 100% состоит из NetBeans - никаких настроек (всего лишь несколько оболочек для невозможного!).

Перепробовав почти все ответы здесь и в других местах безрезультатно, я вернулся к искусству «используй то, что работает».

Главный ответ здесь ( Оливье-Рефало thanx) выглядел как правильное место для начала, но не помогло.

Глядя на другие проекты, которые работали, я заметил некоторые незначительные различия в строках манифеста:

  1. addClasspath, classpathPrefix отсутствовали (удалили их)
  2. В главном классе отсутствовал «ком». (использовал NB -> Свойства проекта-> Выполнить-> Основной класс-> Просмотр, чтобы указать)

Не уверен, почему (я только 3 месяца в Java) или как, но могу только сказать, что это сработало.

Вот только используемый модифицированный блок манифеста:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>
MichaelT
источник
2

Я нашел новое решение для плохого манифеста поколения!

  1. Откройте файл jar с помощью zip-редактора, например WinRAR
  2. Нажмите для META-INF

  3. Добавить или изменить

    • Добавить:

      • Создайте текстовый файл с именем MANIFEST.MF в папке с именем META-INF и добавьте следующую строку:

        • Манифест-Версия: 1.0
        • Основной класс: package.ex.com.views.mainClassName
      • Сохраните файл и добавьте его в zip

    • Редактировать:

      • Перетащите файл, измените файл MANIFEST.MF, чтобы добавить предыдущую строку.
  4. Откройте cmd и введите: java -jar c: /path/JarName.jar

Теперь должно работать нормально!

Дейв Бич
источник
2

большинство решений не работало для меня, но мой инструктор помог мне, я хотел бы поделиться его решением здесь, я использовал терминал kali linux, но должно быть хорошо во всех Debian

javac *.java
nano MANIFEST.MF

в типе файла

Main-Class: Main или любое другое имя вашего основного файла (не забудьте добавить имя пакета, если оно существует)

jar -cvmf MANIFEST.MF new.jar *.class

Теперь для запуска файла используйте

java -jar new.jar

или вы можете перейти к свойствам файла и проверить

Разрешить выполнение файла как программы

дважды щелкните по нему

это помогло мне, в то время как большинство из приведенных выше ответов не


источник
1

У вас может быть та же проблема, что и у меня. После создания файла .jar напишите jar xf app.jar META-INF/MANIFEST.MF. Это создаст копию файла в вашем текущем каталоге, чтобы вы могли прочитать его. Если это только говорит что-то вроде:

Манифест-Версия: 1.0

Создано: 1.8.0_51 (Oracle Corporation)

и не содержит декларации "Main-Class", то я думаю, что вы нашли свою проблему.

Я не знаю, как решить это, хотя. Я проверял других людей с такими же / похожими проблемами в StackOverflow и не мог найти ответ. Однако с этой информацией вы можете получить лучшую помощь (учитывая тот факт, что у вас та же проблема, что и у меня).

Изменить: я пытался с манифест-файл, но не получилось, но моя ошибка состояла в том, чтобы при создании jar-файла назвал только один из классов. Вместо этого я написал * .class, и теперь он работает.

Хотя я не знаю, почему нужно создавать файл манифеста. Но я думаю, это нормально, пока это работает.

жандарм
источник
1

У меня была эта проблема, и я недавно решил ее, выполнив это в Netbeans 8 (см. Изображение ниже):

Свойства проекта Netbeans

  1. перейти к свойствам вашего проекта.
  2. нажмите на Run .
  3. укажите основной класс вашего проекта с помощью обзора .
  4. собрать и запустить файл Jar.
Абдельсалам Шахлол
источник