Can't execute jar-file: "nenhum atributo manifesto principal"

Eu instalei uma aplicação, quando tento executá-la (it's um jarro executável) nada acontece. Quando eu o executo a partir da linha de comando com:

java -jar "app.jar"

Eu recebo a seguinte mensagem:

nenhum atributo manifesto principal, in "app.jar"

Normalmente, se eu mesmo tivesse criado o programa, eu teria adicionado um atributo de classe principal ao arquivo do manifesto. Mas neste caso, como o arquivo é de uma aplicação, eu não posso fazer isso. Eu também tentei extrair o frasco para ver se conseguia encontrar a classe principal, mas existem muitas classes e nenhuma delas tem a palavra "main" nele's name. Deve haver uma maneira de corrigir isso porque o programa roda bem em outros sistemas.

Primeiro, it's um pouco estranho, ver você executar java -jar "app" e não `java -jar app.jar'.

Segundo, para tornar um frasco executável... você precisa de um frasco chamado META-INF/MANIFEST.MF

o arquivo em si deve ter (pelo menos) este revestimento:

Main-Class: com.mypackage.MyClass

Onde `com.mypackage.MyClass' é a classe que detém o public static void main(String[] args) ponto de entrada.

Note que há várias maneiras de fazer isso com o CLI, Maven, Formiga ou Gradle:

Para **CLI***, o seguinte comando serve: (tks @[dvvrt][1])

jar cmvf META-INF/MANIFEST.MF .jar 

Para Maven, algo como o seguinte trecho deve fazer o truque. Note que esta é apenas a definição do plugin, não o pom.xml completo:






      org.apache.maven.plugins
      maven-jar-plugin
      3.1.0
Comentários (11)

Isso deveria ter sido java -jar app.jar em vez de java -jar "app".

A opção -jar' só funciona se o arquivo JAR for um arquivo JAR executável, o que significa que ele deve ter um arquivo manifesto com um atributoMain-Class' nele. Veja Packaging Programs in JAR Files para aprender como criar um arquivo JAR executável.

Se ele'não é um JAR executável, então você'precisará executar o programa com algo parecido:

java -cp app.jar com.somepackage.SomeClass

onde com.somepackage.SomeClass' é a classe que contém o métodomain' para executar o programa. (O que essa classe é depende do programa, é's impossível de dizer a partir da informação que você've forneceu).

Comentários (10)

Se o frasco está't seguindo as regras, ele's não é um frasco executável.

Comentários (2)