Не удается выполнить jar-файл: "отсутствует основной атрибут манифеста"
У меня установлено приложение, и когда я пытаюсь его запустить (это исполняемый JAR-файл), ничего не происходит. Когда я запускаю его из командной строки с помощью команды:
java -jar "app.jar"
Я получаю следующее сообщение:
no main manifest attribute, in "app.jar"
Обычно, если бы я сам создавал программу, я бы добавил атрибут main class в файл манифеста. Но в этом случае, так как файл принадлежит приложению, я не могу этого сделать. Я также пробовал извлечь JAR-файл, чтобы найти главный класс, но классов слишком много, и ни один из них не содержит слово "main" в своем названии. Должен же быть способ это исправить, потому что программа нормально работает на других системах.
5 ответ(ов)
Вы можете использовать плагин 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, которые вы хотите включить.
Попробуйте выполнить следующую команду, чтобы включить JAR:
java -cp yourJarName.jar your.package.your.MainClass
Здесь yourJarName.jar
— это имя вашего JAR-файла, а your.package.your.MainClass
— это полный путь к вашему главному классу в пакете. Убедитесь, что вы правильно указали имя JAR-файла и путь к классу.
Я столкнулся с такой же проблемой, и добавление следующих строк в файл pom.xml решило её. Этот плагин гарантирует, что процесс сборки вашего приложения будет выполняться со всеми необходимыми шагами.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Попробуйте добавить этот код в свой pom.xml, и это должно помочь.
Для 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>
Этого кода достаточно для того, чтобы настроить плагин maven-shade-plugin
, который позволяет упаковать все зависимости в один исполняемый JAR-файл. Обратите внимание на указание основного класса (mainClass
), что также необходимо для запуска вашего приложения.
Чтобы задать главный класс для вашего JAR-файла в Gradle, вам нужно добавить настройки для jar
и manifest
. Пример кода может выглядеть следующим образом:
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'com.package.app.Class'
}
}
В этом примере 'com.package.app.Class'
— это полное имя вашего главного класса. Добавьте этот код в ваш build.gradle
, и Gradle будет включать указанную информацию в манифест JAR-файла.
Что значит "Не удалось найти или загрузить основной класс"?
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Java 8: Преобразование List<V> в Map<K, V>
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Что такое PECS (Producer Extends Consumer Super)?