Дополнительно
Не удается выполнить jar-файл: «нет основного атрибута манифеста»
Я установил приложение, когда я пытаюсь запустить его (это исполняемая банка), ничего не происходит. Когда я запускаю его из командной строки с:
java -jar "app.jar"
Я получаю следующее сообщение:
нет основного атрибута манифеста, в "app.jar"
Обычно, если бы я создал программу сам, я бы добавил атрибут основного класса в файл манифеста. Но в этом случае, поскольку файл из приложения, я не могу этого сделать. Я также попытался извлечь банку, чтобы увидеть, смогу ли я найти основной класс, но есть много классов, и ни у одного из них нет слова «основной» в его названии. Должен быть способ исправить это, потому что программа отлично работает на других системах.
861
35
Во-первых, это немного странно видеть, как вы запускаете
java -jar "app"
, а неjava -jar app.jar
Во-вторых, сделать банку исполняемой... вам нужно нажать файл под названием META-INF / MANIFEST.MF
сам файл должен иметь (по крайней мере) этот лайнер:
Где
com.mypackage.MyClass
- это класс, содержащий public static void main (String [] args) точку входа.Обратите внимание, что есть несколько способов сделать это с CLI, Maven, Ant или Gradle:
Для CLI будет выполнять следующую команду: (tks @ [dvvrt][1])
Для Мавена что-то вроде следующего фрагмента должно помочь. Обратите внимание, что это только определение плагина, а не полное pom.xml :
Это должен был быть
java -jar app.jar
вместоjava -jar "app"
.Параметр
-jar
работает только в том случае, если файл JAR является исполняемым файлом JAR, что означает, что в нем должен быть файл манифеста с атрибутомMain-Class
. См. Упаковка программ в файлах JAR, чтобы узнать, как создать исполняемый файл JARЕсли это не исполняемый JAR, вам нужно запустить программу с чем-то вроде:
где
com.somepackage.SomeClass
- это класс, который содержитmain
метод запуска программы. (Что это за класс, зависит от программы, невозможно сказать по предоставленной вами информации).Кроме того, вы можете использовать плагин maven-assembly-plugin, как показано в приведенном ниже примере:
Это связано с тем, что Java не может найти основной атрибут в файле MANIFEST.MF. Основной атрибут необходим, чтобы указать Java, какой класс он должен использовать в качестве точки входа приложения. Внутри файла jar файл MANIFEST.MF находится в папке META-INF. Хотите знать, как вы можете посмотреть, что находится внутри файла банки? Откройте файл банок с помощью WinRAR .
Основной атрибут внутри MANIFEST.MF выглядит следующим образом:
Вы получаете эту ошибку «без основного атрибута манифеста», когда эта строка отсутствует в файле MANIFEST.MF.
< strike > Это действительно огромный беспорядок, чтобы указать этот атрибут в файле MANIFEST.MF.& Лт; / удар >Обновление: я только что нашел действительно аккуратный способ указать точку входа Приложения в затмении. Когда вы говорите Экспорт,
введите описание изображения здесь!
Ответ Gradle состоит в том, чтобы добавить настройку jar / manifest / attributes следующим образом:
Для мавена это то, что решило это (для меня, для кодовой базы Veetle на GitHub):
Приветствия...
У меня была эта проблема при создании банки с использованием IntelliJ IDEA. Смотрите это обсуждение.
Для меня было решено заново создать артефакт банки, выбрав JAR > Из модулей с зависимостями, но не принимающих каталог по умолчанию для META-INF / MANIFEST.MF. Измените его с - / src / main / java на - / src / main / resources.
В противном случае он включал файл манифеста в банку, но не тот, который должен был быть в - / src / main / java.
Попробуйте эту команду, чтобы включить банку:
У меня была такая же проблема. добавив следующие строки в файл pom, он заставил его работать. Плагин обеспечит процесс сборки вашего приложения всеми необходимыми шагами.
Для меня ни один из ответов не помог - у меня был файл манифеста в правильном месте, содержащий основной класс и все остальное. Что меня сбило с толку, так это:
(источник). Добавление новой строки в конце манифеста исправило это.
Я получил ту же ошибку только сейчас. Если вы используете
gradle
, просто добавьте следующий в urgradle.build
:Где
com.company.project.MainClass
путь к классу ur с методомpublic static void main (String [] args)
.При использовании Maven включите следующее в пом
У меня был тот же вопрос сегодня. Моя проблема была решена при перемещении META-INF в папку ресурсов.
Если банка не следует правилам, это не исполняемая банка.
Я столкнулся с той же проблемой, и она исправлена сейчас :) Просто выполните следующие действия, и ошибка может быть для чего угодно, но приведенные ниже шаги делают процесс более плавным. Я провожу много времени, чтобы найти исправление.
2.После перезапуска затмения, попробуйте узнать, может ли ваше затмение распознать основной класс / метод вашим проектом Java - > щелкните правой кнопкой мыши - > Запустите как --> Запустите конфигурации - > Главный - > нажмите кнопку «Поиск», чтобы увидеть, сможет ли ваше затмение найти ваш основной класс в файле JAR. -- > Это для проверки того, что файл JAR будет иметь точку входа в основной класс.
После этого экспортируйте ваш динамический проект Java в виде файла «Runnable JAR», а не файла JAR.
В конфигурации запуска Java выберите свой основной класс.
После экспорта файла jar используйте команду ниже для выполнения. java -cp [Ваш JAR] .jar [полный пакет] .MainClass например: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Вы можете столкнуться с неподдерживаемой ошибкой версии Java. исправление состоит в том, чтобы изменить java_home в вашем профиле bash оболочки, чтобы он соответствовал версии java, используемой для компиляции проекта в затмении.
Надеюсь, это поможет! Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо проблемы.
Я лично думаю, что все ответы здесь неправильно понимают вопрос. Ответ на этот вопрос заключается в разнице в том, как весенний ботинок строит .jar. Всем известно, что Spring Boot создает такой манифест, который отличается от всех предположений , что это стандартный запуск .jar, которым он может или не может быть:
Возможно, его нужно выполнить с помощью
org.springframework.boot.loader.JarLauncher
на классовой тропе?У меня была такая же проблема. Многие решения, упомянутые здесь, не дали мне всей картины, поэтому я постараюсь дать вам краткое изложение того, как упаковать файлы банок из командной строки .
Если вы хотите, чтобы ваши файлы
.class
были в пакетах, добавьте пакет в начале.java
.Test.java
Чтобы скомпилировать ваш код с файлами
.class
, в конечном итоге со структурой, заданной именем пакета, используйте:-d .
заставляет компилятор создавать нужную структуру каталогов.При упаковке файла
.jar
вам нужно указать процедуру с баночками, как его упаковать. Здесь мы используем опцию setcvfeP
. Это означает сохранить структуру пакета (опцияP
), указать точку входа , чтобы файл манифеста содержал значимую информацию (опцияe
). Опцияf
позволяет указать имя файла, опцияc
создает архив, а опцияv
устанавливает вывод в виде многословного. Здесь следует отметить важные вещи:P
иe
.Затем следует название банки, которую мы хотим
test.jar
.Затем наступает точка входа < packagename >.& Лт; название класса >
И тогда приходит
-C . < packagename > /
, чтобы получить файлы классов из этой папки, сохранив структуру папок.Проверьте файл
.jar
в программе zip. Он должен иметь следующую структуруtest.jar
MANIFEST.MF должен содержать следующее
Если вы редактируете свой манифест вручную , обязательно сохраните новую строку в конце , иначе java не распознает ее.
Выполните файл
.jar
с помощьюВозможно, вы не создали файл jar должным образом:
Следующие работы:
Любой исполняемый файл jar. Следует запустить, щелкнув или выполнив с помощью командной строки, такой как java -jar app.jar (используйте «если путь к банке содержит пространство» - т.е. java -jar "C: \ имя папки \ app.jar"). Если ваш исполняемый файл не работает, это означает, что он не создан должным образом.
Для лучшего понимания извлеките файл jar (или просмотрите с помощью любого инструмента, для Windows 7-Zip - хороший) и проверьте файл в /META-INF/MANIFEST.MF. Если вы найдете какую-либо запись, как
Основной класс: your.package.name.ClaaswithMain - тогда все в порядке, иначе вы должны предоставить его.
Помните о добавлении записи Main-Class в файл MANIFEST.MF, проверьте, где вы ее сохраняете!
Вы можете просто следовать этому шагу Создайте файл банок, используя
При запуске файла банок просто запустите вот так