Αυτό το άρθρο θα δείξει πώς να ξεκινήσετε ένα Ανοιξιάτικη μπότα εφαρμογή από άλλο πρόγραμμα Java. Μια εφαρμογή Spring Boot είναι συνήθως ενσωματωμένη σε ένα μόνο εκτελέσιμο αρχείο JAR. Περιέχει όλες τις εξαρτήσεις μέσα, συσκευασμένα ως ένθετα JAR.
Ομοίως, ένα έργο Spring Boot συνήθως δημιουργείται ως εκτελέσιμο αρχείο JAR από ένα παρεχόμενο πρόσθετο maven που κάνει όλη τη βρώμικη δουλειά. Το αποτέλεσμα είναι ένα βολικό, ενιαίο αρχείο JAR που είναι εύκολο να μοιραστείτε με άλλους, να αναπτυχθεί σε διακομιστή και ούτω καθεξής.
Η εκκίνηση μιας εφαρμογής Spring Boot είναι τόσο εύκολη όσο η πληκτρολόγηση java -jar mySpringProg.jar και η εφαρμογή θα εκτυπώσει στην κονσόλα μερικά όμορφα μορφοποιημένα μηνύματα πληροφοριών.
Τι γίνεται όμως αν Προγραμματιστής Spring Boot θέλει να τρέξει μια εφαρμογή από άλλο πρόγραμμα Java, χωρίς ανθρώπινη παρέμβαση;
Για να συσκευάσετε ένα πρόγραμμα Java με όλες τις εξαρτήσεις σε ένα αρχείο JAR με δυνατότητα εκτέλεσης, πρέπει να παρέχονται εξαρτήσεις που είναι επίσης αρχεία JAR και κατά κάποιο τρόπο να αποθηκεύονται στο τελικό αρχείο JAR που μπορεί να εκτελεστεί.
Η 'σκίαση' είναι μία επιλογή. Η σκίαση εξαρτήσεων είναι η διαδικασία συμπερίληψης και μετονομασίας εξαρτήσεων, μετεγκατάστασης των τάξεων και επανεγγραφής που επηρεάζονται από τον κωδικό και πόρους, προκειμένου να δημιουργηθεί ένα αντίγραφο που ομαδοποιείται μαζί με τον ίδιο κωδικό μιας εφαρμογής (έργου).
Η σκίαση επιτρέπει στους χρήστες να αποσυσκευάζουν όλες τις τάξεις και τους πόρους από εξαρτήσεις και να τα συσκευάζουν ξανά σε ένα τρέξιμο αρχείο JAR. Αυτό μπορεί να λειτουργήσει για απλά σενάρια, ωστόσο, εάν δύο εξαρτήσεις περιέχουν το ίδιο αρχείο πόρου ή την ίδια τάξη με το ίδιο ίδιο όνομα και διαδρομή, θα επικαλύπτονται και το πρόγραμμα ενδέχεται να μην λειτουργεί.
Το Spring Boot ακολουθεί μια διαφορετική προσέγγιση και συσκευάζει εξαρτήματα JAR μέσα σε τρέξιμο JAR, όπως ένθετα JAR.
example.jar | +-META-INF | +-MANIFEST.MF +-org | +-springframework | +-boot | +-loader | +- +-BOOT-INF +-classes | +-mycompany | +-project | +-YourClasses.class +-lib +-dependency1.jar +-dependency2.jar
ΠΡΟΣ ΤΟ Αρχείο JAR είναι οργανωμένο ως τυπικό αρχείο JAR που εκτελείται από Java. Οι τάξεις του Spring Boot loader βρίσκονται στο org/springframework/boot/loader
διαδρομή, ενώ οι κατηγορίες χρηστών και οι εξαρτήσεις βρίσκονται στο BOOT-INF/classes
και BOOT-INF/lib
.
Σημείωση: Εάν είστε νέοι στην Άνοιξη, μπορείτε επίσης να ρίξετε μια ματιά στο Κορυφαία 10 πιο συνηθισμένα ελατήρια πλαισίου της άνοιξης άρθρο .
Ένα τυπικό αρχείο Spring Boot JAR περιέχει τρεις τύπους καταχωρήσεων:
Το Spring Boot Classloader θα ορίσει πρώτα βιβλιοθήκες JAR στο classpath και έπειτα σε τάξεις έργου, κάτι που κάνει μια μικρή διαφορά μεταξύ της εκτέλεσης μιας εφαρμογής Spring Boot από το IDE ( Εκλειψη , IntelliJ ) και από την κονσόλα.
Για πρόσθετες πληροφορίες σχετικά με τις παρακάμψεις κλάσης και τον φορτωτή τάξης, μπορείτε να συμβουλευτείτε αυτό το άρθρο .
Η αυτόματη εκκίνηση μιας εφαρμογής Spring Boot από τη γραμμή εντολών ή το κέλυφος είναι εύκολη με την πληκτρολόγηση των εξής:
java -jar example.jar
Ωστόσο, η εκκίνηση μιας εφαρμογής Spring Boot μέσω προγραμματισμού από άλλο πρόγραμμα Java απαιτεί περισσότερη προσπάθεια. Είναι απαραίτητο να φορτώσετε το org/springframework/boot/loader/*.class
κωδικός, χρησιμοποιήστε λίγο αντανάκλαση Java για να δημιουργήσετε το παράδειγμα JarFileArchive
, JarLauncher
και επικαλέστε το launch(String[])
μέθοδος.
Θα ρίξουμε μια πιο λεπτομερή ματιά στο πώς αυτό επιτυγχάνεται στις ακόλουθες ενότητες.
Όπως έχουμε ήδη επισημάνει, ένα αρχείο Spring Boot JAR είναι ακριβώς όπως οποιοδήποτε αρχείο JAR. Είναι δυνατή η φόρτωση org/springframework/boot/loader/*.class
καταχωρίσεις, δημιουργία αντικειμένων κλάσης και χρήση τους για εκκίνηση εφαρμογών Spring Boot αργότερα.
import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; . . . public static void loadJar(final String pathToJar) throws IOException . . . { // Class name to Class object mapping. final Map classMap = new HashMap(); final JarFile jarFile = new JarFile(pathToJar); final Enumeration jarEntryEnum = jarFile.entries(); final URL[] urls = { new URL('jar:file:' + pathToJar + '!/') }; final URLClassLoader urlClassLoader = URLClassLoader.newInstance(urls);
Εδώ μπορούμε να δούμε classMap
θα διατηρήσει αντικείμενα κλάσης που έχουν αντιστοιχιστεί στα αντίστοιχα ονόματα πακέτων τους, π.χ. τιμή συμβολοσειράς org.springframework.boot.loader.JarLauncher
θα αντιστοιχιστεί στο JarLauncher.class
αντικείμενο.
while (jarEntryEnum.hasMoreElements()) { final JarEntry jarEntry = jarEntryEnum.nextElement(); if (jarEntry.getName().startsWith('org/springframework/boot') && jarEntry.getName().endsWith('.class') == true) { int endIndex = jarEntryName.lastIndexOf('.class'); className = jarEntryName.substring(0, endIndex).replace('/', '.'); try { final Class loadedClass = urlClassLoader.loadClass(className); result.put(loadedClass.getName(), loadedClass); } catch (final ClassNotFoundException ex) { } } } jarFile.close();
Το τελικό αποτέλεσμα του ενώ βρόχος είναι ένας χάρτης που συμπληρώνεται με αντικείμενα κλάσης Spring Boot loader.
Με τη φόρτωση εκτός δρόμου, μπορούμε να προχωρήσουμε στην οριστικοποίηση της αυτόματης εκκίνησης και να την χρησιμοποιήσουμε για να ξεκινήσουμε πραγματικά την εφαρμογή μας.
Η αντανάκλαση Java επιτρέπει τη δημιουργία αντικειμένων από φορτωμένες τάξεις, κάτι που είναι αρκετά χρήσιμο στο πλαίσιο του σεμιναρίου μας.
Το πρώτο βήμα είναι να δημιουργήσετε ένα JarFileArchive
αντικείμενο.
// Create JarFileArchive(File) object, needed for JarLauncher. final Class jarFileArchiveClass = result.get('org.springframework.boot.loader.archive.JarFileArchive'); final Constructor jarFileArchiveConstructor = jarFileArchiveClass.getConstructor(File.class); final Object jarFileArchive = jarFileArchiveConstructor.newInstance(new File(pathToJar));
Ο κατασκευαστής του JarFileArchive
το αντικείμενο παίρνει ένα File(String)
αντικείμενο ως επιχείρημα, οπότε πρέπει να παρέχεται.
Το επόμενο βήμα είναι να δημιουργήσετε ένα JarLauncher
αντικείμενο, το οποίο απαιτεί Archive
στον κατασκευαστή του.
final Class archiveClass = result.get('org.springframework.boot.loader.archive.Archive'); // Create JarLauncher object using JarLauncher(Archive) constructor. final Constructor jarLauncherConstructor = mainClass.getDeclaredConstructor(archiveClass); jarLauncherConstructor.setAccessible(true); final Object jarLauncher = jarLauncherConstructor.newInstance(jarFileArchive);
Για να αποφύγετε τη σύγχυση, σημειώστε ότι Archive
είναι στην πραγματικότητα μια διεπαφή, ενώ JarFileArchive
είναι μία από τις υλοποιήσεις.
Το τελευταίο βήμα στη διαδικασία είναι να καλέσετε το launch(String[])
μέθοδος στο νεοσύστατο μας jarLauncher
αντικείμενο. Αυτό είναι σχετικά απλό και απαιτεί λίγες γραμμές κώδικα.
// Invoke JarLauncher#launch(String[]) method. final Class launcherClass = result.get('org.springframework.boot.loader.Launcher'); final Method launchMethod = launcherClass.getDeclaredMethod('launch', String[].class); launchMethod.setAccessible(true); launchMethod.invoke(jarLauncher, new Object[]{new String[0]});
Το invoke(jarLauncer, new Object[]{new String[0]})
Η μέθοδος θα ξεκινήσει τελικά την εφαρμογή Spring Boot. Σημειώστε ότι το κύριο νήμα θα σταματήσει και περιμένετε εδώ για να τερματιστεί η εφαρμογή Spring Boot.
Η εξέταση του αρχείου Spring Boot JAR θα αποκαλύψει την ακόλουθη δομή:
+--- mySpringApp1-0.0.1-SNAPSHOT.jar +--- META-INF +--- BOOT-INF | +--- classes # 1 - project classes | | | | | +--- com.example.mySpringApp1 | | --- SpringBootLoaderApplication.class | | | +--- lib # 2 - nested jar libraries | +--- javax.annotation-api-1.3.1 | +--- spring-boot-2.0.0.M7.jar | --- (...) | +--- org.springframework.boot.loader # 3 - Spring Boot loader classes +--- JarLauncher.class +--- LaunchedURLClassLoader.class --- (...)
Σημειώστε τους τρεις τύπους καταχωρήσεων:
Και οι δύο κλάσεις έργων (BOOT-INF/classes
) και οι ένθετες JAR (BOOT-INF/lib
) αντιμετωπίζονται από τον ίδιο φορτωτή κλάσης LaunchedURLClassLoader
. Αυτός ο φορτωτής βρίσκεται στη ρίζα της εφαρμογής Spring Boot JAR.
Το LaunchedURLClassLoader
θα φορτώσει το περιεχόμενο της τάξης (BOOT-INF/classes
) μετά το περιεχόμενο της βιβλιοθήκης (BOOT-INF/lib
), το οποίο είναι διαφορετικό από το IDE. Για παράδειγμα, το Eclipse θα τοποθετήσει πρώτα το περιεχόμενο της τάξης στο classpath και στη συνέχεια τις βιβλιοθήκες (εξαρτήσεις).
LaunchedURLClassLoader
επεκτείνεται java.net.URLClassLoader
, το οποίο δημιουργείται με ένα σύνολο διευθύνσεων URL που θα χρησιμοποιηθούν για φόρτωση κλάσης. Η διεύθυνση URL ενδέχεται να οδηγεί σε μια τοποθεσία όπως ένα αρχείο JAR ή ένα φάκελο τάξεων. Κατά την εκτέλεση φόρτωσης τάξης, όλοι οι πόροι που καθορίζονται από τις διευθύνσεις URL θα διασχίζονται με τη σειρά που παρέχονται οι διευθύνσεις URL και θα χρησιμοποιηθεί ο πρώτος πόρος που περιέχει την κλάση αναζήτησης.
Μια κλασική εφαρμογή Java απαιτεί την απαρίθμηση όλων των εξαρτήσεων στο όρισμα classpath, καθιστώντας τη διαδικασία εκκίνησης κάπως δυσκίνητη και περίπλοκη.
Αντίθετα, οι εφαρμογές Spring Boot είναι εύχρηστες και ξεκινούν εύκολα από τη γραμμή εντολών. Διαχειρίζονται όλες τις εξαρτήσεις και ο τελικός χρήστης δεν χρειάζεται να ανησυχεί για τις λεπτομέρειες.
Ωστόσο, η εκκίνηση μιας εφαρμογής Spring Boot από άλλο πρόγραμμα Java καθιστά τη διαδικασία πιο περίπλοκη, καθώς απαιτεί φόρτωση των κλάσεων φόρτωσης του Spring Boot, δημιουργώντας ειδικά αντικείμενα όπως JarFileArchive
και JarLauncher
και, στη συνέχεια, χρησιμοποιώντας την αντανάκλαση Java για να επικαλεστεί το launch
μέθοδος.
Συμπέρασμα : Το Spring Boot μπορεί να αναλάβει πολλές εργασίες για το χειρισμό, επιτρέποντας στους προγραμματιστές να ελευθερώσουν χρόνο και να επικεντρωθούν σε πιο χρήσιμες εργασίες, όπως δημιουργία νέων λειτουργιών, δοκιμές κ.ο.κ.
Το Spring Boot διευκολύνει τη δημιουργία αυτόνομων εφαρμογών, με βάση την άνοιξη, με βάση την άνοιξη εφαρμογές που είναι εύκολο να εκτελεστούν ή να αναπτυχθούν, ενώ το πλαίσιο Spring είναι ένα ολοκληρωμένο σύνολο βιβλιοθηκών Java που χρησιμοποιούνται για την ανάπτυξη πλούσιων εφαρμογών ιστού, επιτραπέζιων υπολογιστών ή κινητών.
Το Spring Boot παρέχει πρότυπα maven, ενσωματωμένο διακομιστή ιστού Tomcat και ορισμένες προκαθορισμένες διαμορφώσεις για την απλοποίηση της χρήσης του Spring. Οι περισσότερες εφαρμογές Spring Boot χρειάζονται πολύ μικρή διαμόρφωση Spring. Το Spring Boot χρησιμοποιείται για τη δημιουργία εφαρμογών Java που μπορούν να ξεκινήσουν χρησιμοποιώντας java -jar ή πιο παραδοσιακές πολεμικές εφαρμογές.
Η αρχιτεκτονική Spring Boot παρέχει εκκινητές, αυτόματη διαμόρφωση και σάρωση στοιχείων για να ξεκινήσετε με το Spring χωρίς την ανάγκη σύνθετων αρχείων διαμόρφωσης XML.