Έχω εγκαταστήσει μια εφαρμογή, όταν προσπαθώ να την εκτελέσω (είναι ένα εκτελέσιμο βάζο) δεν συμβαίνει τίποτα. Όταν την τρέχω από τη γραμμή εντολών με: "Η εφαρμογή είναι έτοιμη για εκτέλεση":
java -jar "app.jar",
Λαμβάνω το ακόλουθο μήνυμα: "Το πρόγραμμα δεν είναι έτοιμο για εκτέλεση":
no main manifest attribute, in "app.jar",
Κανονικά, αν είχα δημιουργήσει το πρόγραμμα μόνος μου, θα είχα προσθέσει ένα χαρακτηριστικό κλάσης main στο αρχείο manifest. Αλλά σε αυτή την περίπτωση, αφού το αρχείο προέρχεται από μια εφαρμογή, δεν μπορώ να το κάνω αυτό. Προσπάθησα επίσης να εξάγω το jar για να δω αν θα μπορούσα να βρω την κύρια κλάση, αλλά υπάρχουν πάρα πολλές κλάσεις και καμία από αυτές δεν έχει τη λέξη "main" στο όνομά της. Πρέπει να υπάρχει τρόπος να διορθωθεί αυτό, διότι το πρόγραμμα τρέχει μια χαρά σε άλλα συστήματα.
Πρώτον, είναι κάπως περίεργο να βλέπουμε ότι τρέχετε το java -jar "app"
και όχι το java -jar app.jar
.
Δεύτερον, για να κάνετε ένα jar εκτελέσιμο... πρέπει να βάλετε ένα αρχείο jar που ονομάζεται META-INF/MANIFEST.MF
το ίδιο το αρχείο θα πρέπει να έχει (τουλάχιστον) αυτή τη γραμμή:
Main-Class: com.mypackage.MyClass
Όπου com.mypackage.MyClass
είναι η κλάση που κατέχει το σημείο εισόδου public static 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, κάτι σαν το ακόλουθο απόσπασμα θα πρέπει να κάνει το κόλπο. Σημειώστε ότι αυτό είναι μόνο ο ορισμός του plugin, όχι το πλήρες 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>
(Επιλέξτε μια <έκδοση>
κατάλληλη για το έργο σας).
Για το Ant, το παρακάτω απόσπασμα θα σας βοηθήσει:
<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>
Συντελεστές Michael Niemand -
Για την Gradle:
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
Αυτό θα έπρεπε να είναι java -jar app.jar
αντί για java -jar "app"
.
Η επιλογή -jar
λειτουργεί μόνο αν το αρχείο JAR είναι ένα εκτελέσιμο αρχείο JAR, πράγμα που σημαίνει ότι πρέπει να έχει ένα αρχείο manifest με ένα χαρακτηριστικό Main-Class
σε αυτό. Ανατρέξτε στην ενότητα Συσκευασία προγραμμάτων σε αρχεία JAR για να μάθετε πώς να δημιουργείτε ένα εκτελέσιμο JAR.
Αν δεν είναι ένα εκτελέσιμο JAR, τότε θα πρέπει να εκτελέσετε το πρόγραμμα με κάτι σαν:
java -cp app.jar com.somepackage.SomeClass
όπου com.somepackage.SomeClass
είναι η κλάση που περιέχει τη μέθοδο main
για την εκτέλεση του προγράμματος. (Το ποια είναι αυτή η κλάση εξαρτάται από το πρόγραμμα, είναι αδύνατο να το καταλάβουμε από τις πληροφορίες που μας δώσατε).
Αν η βάζα δεν ακολουθεί τους κανόνες, δεν είναι εκτελέσιμη βάζα.