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)
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
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:
<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>
(Escolha um <version>
apropriado ao seu projeto).
Para **Ant***, o trecho abaixo deve ajudar:
<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>
Créditos Michael Niemand -
Para **Gradle***:
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
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 atributo
Main-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étodo
main' 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).
Se o frasco está't seguindo as regras, ele's não é um frasco executável.