Неможливо виконати jar-файл: "немає головного атрибута маніфесту"


970

Я встановив додаток, коли я намагаюся запустити його (це виконується jar) нічого не відбувається. Коли я запускаю його з командного рядка за допомогою:

java -jar "app.jar"

Я отримую таке повідомлення:

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

Як правило, якби я сам створив програму, я додав би атрибут основного класу до файлу маніфесту. Але в цьому випадку, оскільки файл із програми, я не можу цього зробити. Я також спробував витягти банку, щоб побачити, чи зможу я знайти основний клас, але є багато класів, і жоден з них не має в своєму імені слово "головний". Має бути спосіб виправити це, оскільки програма працює нормально в інших системах.


Шукайте основні методи; не можна покладатися на назви класів.
Дейв Ньютон

2
Я знаю, але оскільки у мене є лише файли .class, я не можу реально бачити методи. Або я можу?
Ewoud

Ви насправді не набираєте цитати, чи не так? У будь-якому випадку існує ряд способів побачити методи, включаючи використання javap. Можливо, ви захочете відкрутити його і подивитися, чи немає насправді маніфесту.
Дейв Ньютон

Пов’язано: із залежностями: stackoverflow.com/a/23986765/360211
weston

що робити, якщо у мене немає основного класу, оскільки я запускаю код за допомогою CommandLineJobRunner
Kamini

Відповіді:


946

По-перше, це дивно, бачити, як ти біжиш, java -jar "app"а ніjava -jar app.jar

По-друге, щоб зробити банку виконуваним ... вам потрібно скріпити файл під назвою META-INF / MANIFEST.MF

сам файл повинен мати (принаймні) цей один вкладиш:

Main-Class: com.mypackage.MyClass

Де com.mypackage.MyClassзнаходиться клас, що містить загальну точку входу загальнодоступних статичних недійсних (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'
        )
    }
}

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, але він не працює, у мене все-таки проблема!
Віцело

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елемент у файлі Maven, створеному VSC, тому я просто додав до нього <configuration>розділ.
Аарон Франке

279

Це мало бути 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
дякую за вашу відповідь, але ваше рішення працює лише в тому випадку, якщо я знаю назву класу, який містить основний метод. І це була помилка друку ... Це повинно було бути "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>
    <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-залежностей слід дослівно ставити як, а не замінювати назви файлів jar, які ви хочете включити.


3
Ідеально, це працює. Він з’єднує всі залежності в одну банку, тим самим дозволяючи вам скласти / скласти проект і запустити його з поля.
Пол

2
У контексті плагіна відтінку потрібно дотримуватися довідки у Executable JAR .
коппор

3
Це з maven-assembly-pluginпопрацювали. maven-jar-pluginне.
Мартинас Юсевічус

Примітка: помістіть цей код у свій pom.xmlфайл всередині, <build><plugins> PUT IT HERE </plugins></build>а потім виконайте пакет maven (у відкритому розсувному меню IDEA відкрийте Maven праворуч, шукайте проект> Життєвий цикл> пакет). Тоді ваш jar файл буде в папці Target. Ура!
Кирило Кармазін

Я справді боровся з цим питанням ... Це прекрасно працює. Дякую!
jmojico

60

Це тому, що Java не може знайти атрибут Main у файлі MANIFEST.MF. Основний атрибут необхідний, щоб сказати java, який клас він повинен використовувати як точку входу програми. Всередині файлу jar файл MANIFEST.MF знаходиться в папці META-INF. Цікаво, як ви могли подивитися, що знаходиться у файлі 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.

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


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> <version> 2.0.1.RELEASE < / версія> </plugin>
Tenflex

Вибачте, але це не рішення, тому що він не говорить про весняний завантаження, це загальна проблема із виконанням баночки :)
LAMRIN TAWSRAS

Велике спасибі, це вирішило проблему весняного завантаження!
AleksandarT

Я працюю над весняним завантаженням 2.2.0. Випуск. На жаль, це рішення для мене не вийшло. Однак він працює, коли ви посилаєтесь із <parent>...</parent>програми в pom.xml. Я здогадуюсь, якщо ми відвідаємо parentдодаток pom.xml, ми отримаємо чітке уявлення.
тусар

Нарешті я вирішив своє питання із звичаєм repackage-classifier. Будь ласка , відвідайте docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin / ...
ТУСАР

30

Відповідь Gradle полягає в тому, щоб додати такий параметр jar / manifest / attributes:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

1
найпростіша відповідь поки що.
lasec0203

29

У мене виникла ця проблема під час створення баночки за допомогою IntelliJ IDEA. Дивіться цю дискусію .

Для мене це вирішило відновити артефакт jar, вибравши JAR> З модулів із залежностями, але не прийнявши Каталог за замовчуванням для META-INF / MANIFEST.MF. Змініть його з - / src / main / java на - / src / main / ресурси.

В іншому випадку він містив файл маніфесту в банку, але не той, який має мати - / src / main / java.


Це працювало для мене з IDEA 14.1.6. Я також додав властивість збірки для pom.xml, але це не мало ефекту. Але ваша відповідь вирішила це, дякую.
lsrom

3
Дякуємо за те, що врятували мій робочий стіл від того, що він не втомлювався чистим розладом нічого іншого;) Ваше посилання здається порушеним, але я можу підтвердити, що це працює чудово. Тестований на IntelliJ IDEA 2018.2.5 (Community Edition)
Маттіас Бьо

підтвердив, що це працює, хоча я не маю довідника / ресурси
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модуль не запускав плагін відтінку.
Райсторм

24

Спробуйте скористатися цією командою, щоб включити банку:

java -cp yourJarName.jar your.package..your.MainClass

1
Один із способів - включити основний клас у pom.xml та використовувати команду java -jar, інший - використовувати команду java -cp.
Gaurav Khare

15

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

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

( джерело ). Додавання нового рядка в кінці маніфесту виправило його.


11

Якщо ви використовуєте Maven, включіть наступне в пом

<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файл, але не, як зробити так, щоб весняний завантажувач автоматично обробляв його.
Вішран

5
Я не бачу жодних причин для спростування цієї відповіді. Якщо ви не використовуєте, spring-bootпросто ігноруйте його. Stackoverflow також допомагає створити власне сховище випусків, з яким ви стикаєтесь під час програмування.
Вишран

@Vishrant Я не знаю про інших, але я спростував, тому що ця відповідь не стосується питання, як було поставлено. Можливо, щойно трапилось відповісти на ваше запитання, але ваше запитання насправді не було тим, що йому задавали.
Бейн

@Bane впевнений. але питання можна сприймати в широкому сенсі, і ця відповідь стосується його і може допомогти іншим у тому сенсі, коли вони будуть використовувати весняний черевик.
Вішрант

10

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


Це працювало і для мене. Спробуйте, якщо ви використовуєте Jetbrains IntelliJ
NickSoft

Дякую, що справді працював на мене :)
Syed Mehtab Hassan

Це теж працювало для мене на Intellij. Спасибі, чоловіче.
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)методом.


Це мені допомогло! Підручники gradle були вказані за допомогою mainClassNameнабору змінних верхнього рівня , але це допомагає лише gradle runкоманді, а не при створенні виконуваного файлу .jar
kevlarr

8

Проблема в тому , що MAVEN його спроба включити перший файл MANIFEST.MF з першої бібліотеки з залежностей замість нашого власного MANIFEST.MF , коли ви використовуєте АРТЕФАКТИ! .

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

    Версія маніфесту: 1.0 Основний клас: 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. Додайте до розділу збирання 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 з усіма залежностями у папку "Ціль". Також він буде встановлений у місцевому сховищі 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 [повний пакет] .MainClass, наприклад: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. Ви можете зіткнутися з непідтримуваною помилкою версії Java. виправлення полягає в тому, щоб змінити java_home у вашому профілі bash для відповідності версії java, яка використовується для складання проекту у затемнення.

Сподіваюся, це допомагає! Будь ласка, повідомте мені, якщо у вас все ще виникають проблеми.


5

У мене була така ж проблема. Багато згаданих тут рішень не дали мені всієї картини, тому я спробую дати вам короткий опис того, як упакувати файли jar із командного рядка .

  1. Якщо ви хочете мати свої .classфайли в пакетах, додайте пакунок на початку .java.

    Test.java

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

    javac -d . Test.java

    -d .Робить компілятор створити структуру каталогів ви хочете.

  3. Упаковуючи .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

1
Четвертий крок вашої відповіді дуже важливий! Мій маніфест не працював через цю нову лінію в кінці, яку я не знав, що мені потрібно поставити. Усі відповіді, які я відвідав на цю тему (багато), про це не згадували, і це обов’язково для тих, хто не використовує мавен, мурашник, градуль тощо.
Мод

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?


Це звучить перспективно. Як саме ви додаєте JarLauncher на класний шлях?
MarkHu

4

Будь-який виконуваний файл jar повинен запускатися клацанням або запуском у командному рядку, наприклад, java -jar app.jar (використовуйте "якщо шлях jar містить пробіл" - тобто java -jar "C: \ ім'я папки \ app.jar"). Якщо ваша виконувана банка не працює, це означає, що вона не створена належним чином.

Для кращого розуміння витягніть файл jar (або перегляньте за допомогою будь-якого інструменту, для Windows 7-Zip це приємно) і перевірте файл у розділі /META-INF/MANIFEST.MF. Якщо ви знайдете будь-який запис, як

Основний клас: your.package.name.ClaaswithMain - тоді це добре, інакше вам потрібно надати його.

Будьте в курсі додавання запису основного класу до файлу MANIFEST.MF, перевірте, де ви його зберігаєте!


4

Ви можете просто виконати цей крок. Створіть файл jar за допомогою

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

Під час запуску файлу jar просто запустіть такий

 java -cp jarfile-name main-classname

4

Можливо, ви не створили належним чином файл jar:

напр .: відсутній варіант м у створенні баночки

Наступні роботи:

jar -cvfm MyJar.jar Manifest.txt *.class

4

Якщо ви використовуєте командний рядок для збирання .jar, можна вказати на головне, не додаючи файл Manifest. Приклад:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(парам "е" робить це: 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

Це не завжди перший клас. Майже ніколи. Командний рядок повинен бути java -cp ... somepackage.App.
користувач207421

2

Оскільки ви додали MANIFEST.MF, я думаю, ви повинні врахувати порядок поля у цьому файлі. Моє оточення 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

Так? Порядок несуттєвий. Незрозуміло, на що ви претендуєте.
користувач207421

2

(перша публікація - тому вона може бути не чистою)

Це моє виправлення для ОС X 11.6, на базі Maven Netbeans 8.2. На сьогоднішній день у моєму додатку є 100% Netbeans - ніяких налаштувань (лише кілька оболонок уникне неможливого!).

Спробувавши більшість усіх відповідей тут і в іншому місці безрезультатно, я повернувся до мистецтва "використовувати те, що працює".

Тут найкраща відповідь ( олів'є-рефало thanx) виглядала як правильне місце для початку, але не допомогла.

Дивлячись на інші проекти, які спрацювали, я помітив деякі незначні відмінності у маніфестних лініях:

  1. addClasspath, classpathPrefix були відсутні (видалено їх)
  2. mainClass бракував "com". (використовується NB -> Властивості проекту-> Виконати-> Основний клас-> Оглянути, щоб вказати)

Не впевнений, чому (я лише 3 місяці в Java) чи як, але можу сказати, що це спрацювало.

Ось лише використаний модифікований блок маніфестів:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>

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

у типі файлу

Основний клас: Основне або все, що є вашим основним іменем файлу (обов'язково додайте ім'я пакета, якщо він існує)

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)

і не містить декларації "Основного класу", я думаю, ви знайшли свою проблему.

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

Редагувати: Я спробував із файлом маніфесту, але не змусив його працювати, але моя помилка полягала в тому, що я назвав один із класів під час створення jar-файлу. Я написав * .class замість цього, і він працює зараз.

Хоча я не знаю, чому потрібно створити файл маніфесту. Але я здогадуюсь це добре, поки це працює.


1

У мене була ця проблема, і я її вирішив недавно, зробивши це в Netbeans 8 (див. Зображення нижче):

Властивості проекту Netbeans

  1. перейдіть до властивостей вашого проекту.
  2. натисніть Виконати .
  3. вкажіть основний клас вашого проекту за допомогою перегляду .
  4. побудувати та запустити файл Jar.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.