Я установил приложение, когда я пытаюсь его запустить (это исполняемый файл jar), ничего не происходит. Когда я запускаю его из командной строки с помощью:
java -jar "app.jar"
Я получаю следующее сообщение:
нет основного атрибута манифеста, в "app.jar"
Обычно, если бы я создал программу сам, я бы добавил атрибут основного класса в файл манифеста. Но в этом случае, так как файл из приложения, я не могу этого сделать. Я также попытался извлечь банку, чтобы посмотреть, смогу ли я найти основной класс, но есть много классов, и ни один из них не имеет слова «main» в своем названии. Должен быть способ исправить это, потому что программа отлично работает в других системах.
javap
. Возможно, вы захотите распаковать его и посмотреть, нет ли на самом деле манифеста.Ответы:
Во-первых, странно видеть, что ты бежишь,
java -jar "app"
а неjava -jar app.jar
Во-вторых, чтобы сделать исполняемый файл jar ... вам нужно создать файл с именем META-INF / MANIFEST.MF
сам файл должен иметь (по крайней мере) этот один вкладыш:
Где
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 :
(Выберите
<version>
подходящий для вашего проекта.)Для Ant приведенный ниже фрагмент кода должен помочь:
Кредиты Майкла Ниманда -
Для Gradle :
источник
lib
папку, вам нужно только выполнить JAR с,java -jar myproject.jar
и он найдет зависимости.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
элемент в сгенерированном VSC файле Maven, поэтому я просто добавил в него<configuration>
раздел.Это должно было быть
java -jar app.jar
вместоjava -jar "app"
.-jar
Опция работает только в случае , если файл JAR представляет собой исполняемый файл JAR, который означает , что он должен иметь файл манифеста сMain-Class
атрибутом в нем. См. Упаковка программ в файлах JAR, чтобы узнать, как создать исполняемый файл JAR.Если это не исполняемый файл JAR, вам нужно запустить программу с чем-то вроде:
где
com.somepackage.SomeClass
класс, который содержитmain
метод для запуска программы. (Что это за класс, зависит от программы, из информации, которую вы предоставили, невозможно узнать).источник
META-INF
каталоге внутри файла JAR). Он должен содержатьMain-Class
атрибут, который дает вам имя основного класса.В качестве альтернативы вы можете использовать maven-assembly-plugin, как показано в следующем примере:
В этом примере все банки зависимостей, указанные в разделе, будут автоматически включены в ваш отдельный файл. Обратите внимание, что jar-with-dependencies буквально следует указывать как, а не заменять именами файлов jar, которые вы хотите включить.
источник
maven-assembly-plugin
сработало.maven-jar-plugin
не.pom.xml
файл внутри,<build><plugins> PUT IT HERE </plugins></build>
а затем выполните maven Package (в IDEA откройте скользящее меню maven справа, найдите проект> Lifecycle> package). Тогда ваш файл jar будет в папке Target. Ура!Это потому, что Java не может найти атрибут Main в файле MANIFEST.MF. Атрибут Main необходим для указания java, какой класс он должен использовать в качестве точки входа приложения. Внутри jar-файла файл MANIFEST.MF находится в папке META-INF. Хотите знать, как вы можете посмотреть, что находится внутри файла JAR? Откройте файл JAR с WinRAR.
Главный атрибут внутри MANIFEST.MF выглядит так:
Вы получаете эту ошибку «без основного атрибута манифеста», когда эта строка отсутствует в файле MANIFEST.MF.
Указывать этот атрибут внутри файла MANIFEST.MF - действительно большой беспорядок.Обновление: я только что нашел очень удобный способ указать точку входа приложения в Eclipse. Когда вы говорите, экспорт,
источник
Я была такая же проблема. добавив следующие строки в файл pom, он заработал. Плагин обеспечит процесс сборки вашего приложения всеми необходимыми шагами.
источник
<parent>...</parent>
приложения в pom.xml. Я предполагаю, что если мы посетимparent
pom.xml приложения, мы получим четкое представление.repackage-classifier
. Пожалуйста, посетите docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…Ответ Gradle - добавить параметр jar / manifest / attribute, например, так:
источник
У меня была эта проблема при создании банки с помощью IntelliJ IDEA. Смотрите это обсуждение .
Для меня это решило воссоздать артефакт jar, выбрав JAR> Из модулей с зависимостями, но не принимая каталог по умолчанию для META-INF / MANIFEST.MF. Измените его с - / src / main / java на - / src / main / resources.
В противном случае это был файл манифеста в jar, но не тот, который должен быть в - / src / main / java.
источник
Для maven это то, что решило это (для меня, для кодовой базы Veetle на GitHub):
Приветствия ...
источник
mvn package shade:shade
просто запускmvn package
не запускал плагин Shade.Попробуйте эту команду, чтобы включить банку:
источник
Для меня ни один из ответов действительно не помог - у меня был файл манифеста в правильном месте, содержащий Main-Class и все остальное. То, что споткнуло меня, было этим:
( источник ). Добавление новой строки в конце манифеста исправило его.
источник
Если вы используете Maven, включите следующее в pom
источник
no main manifest attribute
ошибки, но я работаю над приложением весенней загрузки, поэтому этот ответ помог мне. Я уже знал, как создатьMETA-INF/MANIFEST.MF
файл, но не как заставить Spring-Boot автоматически обрабатывать его.spring-boot
просто игнорируйте это. Stackoverflow также помогает создать собственный репозиторий проблем, с которым вы сталкиваетесь при программировании.У меня была такая же проблема сегодня. Моя проблема была решена моим перемещением META-INF в папку ресурсов.
источник
Я получил ту же ошибку только сейчас. Если вы используете
gradle
, просто добавьте следующий в вашgradle.build
:Где
com.company.project.MainClass
путь к классу ур сpublic static void main(String[] args)
методом.источник
mainClassName
набора переменных верхнего уровня , но это помогает только сgradle run
командой, а не с созданием исполняемого файла .jarПроблема MAVEN в том, что он пытается включить первый файл MANIFEST.MF из первой библиотеки из зависимостей вместо НАШЕГО МАНИФЕСТА.MF, КОГДА ВЫ ИСПОЛЬЗУЕТЕ ИЗДЕЛИЯ! ,
Скопируйте настоящий файл MANIFEST.MF, который уже сгенерирован в вашем проекте MAVEN.
Manifest-версия: 1.0 Main-Class: yourpacket.yourmainclass (например, info.data.MainClass)
Замените им содержимое файла MANIFEST.MF из youjar.zip.
ИЛИ!
Просто создайте свой собственный MANIFEST.MF и:
Но если вы используете панель maven (или командную строку maven), вы можете заставить ее сгенерировать собственный манифест и включить его в файл JAR.
Добавьте в раздел сборки you pom.xml этот код:
Откройте панель MAVEN (в Intellij) и выполните «Установить». Он сгенерирует файл MANIFEST и скомпилирует свойство JAR-файл со всеми зависимостями в папку «Target». Также он будет установлен в локальный репозиторий maven.
источник
Если банка не соответствует правилам , это не исполняемый файл.
источник
Я столкнулся с той же проблемой, и теперь она исправлена :) Просто выполните следующие шаги, и ошибка может быть для чего угодно, но следующие шаги делают процесс более плавным. Я трачу много времени, чтобы найти решение.
1. Попробуйте перезапустить Eclipse (если вы используете Eclipse для создания файла JAR) -> На самом деле это помогло моей проблеме в правильном экспорте файла JAR.
2.После перезапуска затмения попробуйте посмотреть, сможет ли ваше затмение распознать основной класс / метод по вашему Java-проекту -> щелкните правой кнопкой мыши -> Выполнить как -> Выполнить настройки -> Основные -> нажмите кнопку Поиск чтобы увидеть, может ли ваше затмение найти ваш основной класс в файле JAR. -> Это для проверки того, что JAR-файл будет иметь точку входа в основной класс.
После этого экспортируйте ваш проект Java Dynamic как файл «Runnable JAR», а не файл JAR.
В конфигурации запуска Java выберите свой основной класс.
После экспорта файла jar используйте приведенную ниже команду для выполнения. java -cp [Ваш JAR] .jar [полный пакет]. Основной класс, например: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Вы можете столкнуться с ошибкой неподдерживаемой версии Java. исправление заключается в изменении java_home в вашем профиле оболочки оболочки в соответствии с версией java, используемой для компиляции проекта в eclipse.
Надеюсь это поможет! Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо проблемы.
источник
У меня такая же проблема. Многие из упомянутых здесь решений не дали мне полной картины, поэтому я постараюсь дать вам краткую информацию о том, как упаковать файлы JAR из командной строки .
Если вы хотите, чтобы ваши
.class
файлы были в пакетах, добавьте пакет в начале.java
.Test.java
Чтобы скомпилировать код с
.class
файлами, заканчивающимися структурой, заданной именем пакета, используйте:-d .
Делает компилятор создать структуру каталогов вы хотите.При упаковке
.jar
файла вы должны указать рутине jar, как его упаковать. Здесь мы используем набор опцийcvfeP
. Это необходимо для сохранения структуры пакета (опцияP
), укажите точку входа, чтобы файл манифеста содержал значимую информацию (опцияe
). Опцияf
позволяет указать имя файла, опцияc
создает архив, а опцияv
устанавливает подробный вывод. Важные вещи, чтобы отметить здесьP
иe
.Затем идет название банки, которую мы хотим
test.jar
.Затем наступает точка входа.
И затем приходит,
-C . <packagename>/
чтобы получить файлы классов из этой папки, сохраняя структуру папки.Проверьте ваш
.jar
файл в программе zip. Он должен иметь следующую структуруtest.jar
MANIFEST.MF должен содержать следующее
Если вы редактируете свой манифест вручную , обязательно сохраняйте новую строку в конце, иначе java не распознает его.
Запустите ваш
.jar
файл систочник
Я лично думаю, что все ответы здесь - неправильное понимание вопроса. Ответ заключается в том, как Spring-Boot создает .jar. Всем известно, что Spring Boot настраивает манифест, подобный этому, который отличается от предположения каждого, что это стандартный запуск .jar, который может быть или не быть:
Возможно, это должно быть выполнено с
org.springframework.boot.loader.JarLauncher
помощью classpath?источник
Любой исполняемый 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, проверьте, где вы ее сохраняете!
источник
Вы можете просто выполнить этот шаг. Создайте JAR-файл, используя
Запустив файл jar, просто запустите
источник
Возможно, вы не создали файл JAR должным образом:
Следующие работы:
источник
Если вы используете командную строку для сборки .jar, то можно указать на главное без добавления файла манифеста. Пример:
(параметр «e» делает это: TheNameOfClassWithMainMethod - это имя класса с методом main () и app.jar - имя исполняемого файла .jar и * .class - только файлы всех классов для сборки)
источник
Для меня эта ошибка произошла просто потому, что я забыл сказать Eclipse, что мне нужен исполняемый jar-файл, а не простой jar-файл библиотеки. Поэтому, когда вы создаете JAR-файл в Eclipse, убедитесь, что вы нажимаете правую кнопку-переключатель.
источник
Приведенные выше ответы были только частично полезны для меня.
java -cp
был частью ответа, но мне нужна была более конкретная информация о том, как определить класс для запуска. Вот что сработало для меня:Шаг 1: найдите класс, который мне нужен для запуска
Верхние строки результата были:
App.class содержит основной класс для запуска. Я не уверен на 100%, можете ли вы всегда предполагать, что класс, который вам нужен, - первый, но это было для меня. Если это не так, я бы предположил, что не так уж сложно использовать grep для исключения результатов, связанных с библиотекой, чтобы сократить список классов до приемлемого размера.
Оттуда это было легко: я просто использую этот путь (без суффикса ".class"):
источник
java -cp ... somepackage.App
.Поскольку вы добавили MANIFEST.MF, я думаю, вы должны рассмотреть порядок полей в этом файле. Мой env
java version "1.8.0_91"
и мой MANIFEST.MF как здесь
Тем не менее, это, как показано ниже
источник
(первый пост - поэтому он может быть не чистым)
Это мое исправление для OS X 11.6, программы Netbeans 8.2 на основе Maven. До сих пор мое приложение на 100% состоит из NetBeans - никаких настроек (всего лишь несколько оболочек для невозможного!).
Перепробовав почти все ответы здесь и в других местах безрезультатно, я вернулся к искусству «используй то, что работает».
Главный ответ здесь ( Оливье-Рефало thanx) выглядел как правильное место для начала, но не помогло.
Глядя на другие проекты, которые работали, я заметил некоторые незначительные различия в строках манифеста:
Не уверен, почему (я только 3 месяца в Java) или как, но могу только сказать, что это сработало.
Вот только используемый модифицированный блок манифеста:
источник
Я нашел новое решение для плохого манифеста поколения!
Нажмите для META-INF
Добавить или изменить
Добавить:
Создайте текстовый файл с именем MANIFEST.MF в папке с именем META-INF и добавьте следующую строку:
Сохраните файл и добавьте его в zip
Редактировать:
Откройте cmd и введите: java -jar c: /path/JarName.jar
Теперь должно работать нормально!
источник
большинство решений не работало для меня, но мой инструктор помог мне, я хотел бы поделиться его решением здесь, я использовал терминал kali linux, но должно быть хорошо во всех Debian
в типе файла
Теперь для запуска файла используйте
или вы можете перейти к свойствам файла и проверить
это помогло мне, в то время как большинство из приведенных выше ответов не
источник
У вас может быть та же проблема, что и у меня. После создания файла .jar напишите
jar xf app.jar META-INF/MANIFEST.MF
. Это создаст копию файла в вашем текущем каталоге, чтобы вы могли прочитать его. Если это только говорит что-то вроде:и не содержит декларации "Main-Class", то я думаю, что вы нашли свою проблему.
Я не знаю, как решить это, хотя. Я проверял других людей с такими же / похожими проблемами в StackOverflow и не мог найти ответ. Однако с этой информацией вы можете получить лучшую помощь (учитывая тот факт, что у вас та же проблема, что и у меня).
Изменить: я пытался с манифест-файл, но не получилось, но моя ошибка состояла в том, чтобы при создании jar-файла назвал только один из классов. Вместо этого я написал * .class, и теперь он работает.
Хотя я не знаю, почему нужно создавать файл манифеста. Но я думаю, это нормально, пока это работает.
источник
У меня была эта проблема, и я недавно решил ее, выполнив это в Netbeans 8 (см. Изображение ниже):
источник