9 λάθη που πρέπει να αποφύγετε κατά τον προγραμματισμό σε Java
Ποια λάθη πρέπει να αποφεύγονται κατά τον προγραμματισμό σε Java; Στο παρακάτω κομμάτι απαντάμε σε αυτό το ερώτημα.

Υπάρχει μια χρυσή τομή για τον χειρισμό πολλών περιβαλλόντων για μεγάλο αριθμό σε ένα μόνο μηχάνημα; Ο ειδικός μας σε Java Bartłomiej γνωρίζει την απάντηση!
Ας ρίξουμε μια ματιά σε ένα τυπικό περιβάλλον εργασίας σε ένα οίκος λογισμικού. Έχετε μερικούς πελάτες που έχουν διαφορετικά περιβάλλοντα. Ορισμένοι προτιμούν τη MySQL, άλλοι την Postgres. Μια έκδοση της εφαρμογής σας χρειάζεται Java 11, και ένα άλλο Java 17. Το frontend χρειάζεται npm 12 ή 16 επειδή χρησιμοποιείτε διαφορετικές εκδόσεις της γωνιακή. Τέλος, έχετε αυτόν τον τρισδιάστατο πίνακα που περιέχει συνδυασμούς όλων των εκδόσεων των ΒΔ, του backend και του frontend. Ακούγεται άσχημο, αλλά μια μέρα το αφεντικό σας λέει...
Η κατάσταση που περιγράφεται παραπάνω δεν είναι κάτι ασυνήθιστο. Η μετάβαση μεταξύ γλωσσικών εκδόσεων ή εκδόσεων πλαισίου, οι ενημερώσεις των βάσεων δεδομένων ή απλώς οι διαφορετικές απαιτήσεις που προέρχονται από τους πελάτες μπορούν να ανατρέψουν όλες τις διαμορφώσεις. Θα πρέπει να έχουμε μια λύση που θα μας βοηθήσει να διαχειριστούμε αυτές τις αλλαγές, μια λύση που να ταιριάζει με μερικές υποθέσεις ή/και απαιτήσεις ή/και στόχους:
Σε αυτό το άρθρο, θα επικεντρωθώ σε τρεις τομείς. Ο πρώτος είναι τα εργαλεία για τη Java και τη JVM. Ο δεύτερος είναι τα εργαλεία γενικής χρήσης. Ο τρίτος είναι το πώς μπορούμε να χρησιμοποιήσουμε το docker για να επιτύχουμε τους στόχους μας.
Όταν είστε Προγραμματιστής Java ή, γενικότερα, εργάζεστε με Τεχνολογίες JVM, τότε μπορείτε να χρησιμοποιήσετε SDKMAN!. Πρόκειται για ένα πολύ ωραίο και εύχρηστο εργαλείο που υποστηρίζει πολλές βιβλιοθήκες, πλαίσια και γλώσσες.
Η διαδικασία εγκατάστασης του SDKMAN! Είναι πολύ απλό. Πρέπει να τρέξετε:
curl -s "https://get.sdkman.io" | bash
και στη συνέχεια
source "$HOME/.sdkman/bin/sdkman-init.sh"
Τώρα μπορείτε να διαχειρίζεστε Java, Σκάλα και Maven εκδόσεις.
Σε αυτό το παράδειγμα, θα εγκαταστήσουμε και θα ενημερώσουμε την έκδοση μερικών εργαλείων. Αυτό είναι μόνο ένα μικρό υποσύνολο των διαθέσιμων εργαλείων.
Ας υποθέσουμε ότι το νέο σας έργο χρησιμοποιεί το Java 17. Δεν έχετε κανένα Java εγκατεστημένη έκδοση. Θέλετε να την εγκαταστήσετε και, επιπλέον, να προσθέσετε ένα εργαλείο Maven Daemon για να κάνετε τις κατασκευές πιο γρήγορες. Έτσι, πρέπει να εγκαταστήσετε και το Maven. Για να το κάνετε αυτό, πρέπει να εκτελέσετε τρεις απλές εντολές:
$ sdk install java 17-open
$ sdk εγκατάσταση maven 3.8.4
$ sdk install mvnd 0.7.1
Στο τέλος της εγκατάστασης κάθε εργαλείου, θα σας ζητηθεί να το κάνετε προεπιλεγμένο:
Θέλετε να οριστεί ως προεπιλογή η Java 17-open; (Y/n):
Αυτό είναι σημαντικό όταν εγκαθιστάτε μια νέα έκδοση μιας βιβλιοθήκης ή μιας γλώσσας, επειδή το SDKMAN! θα ορίσει αυτή την προεπιλεγμένη έκδοση ως παγκόσμια για όλα τα τερματικά του τρέχοντος χρήστη.
Από καιρό σε καιρό, το SDKMAN! πρέπει να ενημερώνει τα ευρετήρια. Κατά τη διάρκεια αυτής της διαδικασίας, μπορεί να λάβετε μήνυμα ότι υπάρχουν νέες εκδόσεις των εργαλείων που χρησιμοποιείτε. Μπορούμε να ελέγξουμε ποιες εκδόσεις είναι διαθέσιμες πληκτρολογώντας sdk ls
. Για το sdk ls maven
:
Διαθέσιμες εκδόσεις Maven
================================================================================
3.8.6 3.3.3
3.8.5 3.3.1
3.8.4 3.2.5
3.8.3 3.2.3
3.8.2 3.2.2
3.8.1 3.2.1
3.6.3 3.1.1
3.6.2 3.1.0
3.6.1 3.0.5
3.6.0 3.0.4
3.5.4
3.5.3
3.5.2
3.5.0
3.3.9
================================================================================
τοπική έκδοση
σε χρήση
================================================================================
Όπως βλέπουμε παραπάνω, το Maven έχει νεότερη έκδοση από αυτή που χρησιμοποιούμε. Το ίδιο ισχύει και για το mvnd
(0.8.2) και Java (19-open). Ας ενημερώσουμε τα πάντα. Για να το κάνουμε αυτό, πρέπει απλώς να καλέσουμε την εντολή install, αλλά αυτή τη φορά, δεν χρησιμοποιούμε προσδιορισμό έκδοσης:
$ sdk install maven
$ sdk install mvnd
$ sdk εγκατάσταση java
Όμως κάτι λάθος συνέβη. Maven
και mvnd
έχουν σωστές εκδόσεις, αλλά Java έχει έκδοση 17.0.5-tem
. Αυτό συμβαίνει επειδή η "νεότερη" έκδοση του εργαλείου ελέγχεται από τον προμηθευτή του και όχι από τον τοπικό SDKMAN! Ένας πωλητής στο SDKMAN! είναι κάποιος που μπορεί να δημοσιεύσει μια έκδοση. Ωστόσο, ας υποθέσουμε ότι τελικά εγκαθιστούμε 19-ανοικτό
, και το κάναμε προεπιλεγμένο, αλλά για κάποιο λόγο, πρέπει να χρησιμοποιήσουμε το 17-ανοικτό
.
Μπορούμε να διαμορφώσουμε ένα προεπιλογή
έκδοση ενός εργαλείου που είναι καθολική για όλα τα έργα και τα τερματικά. Όταν όμως χρειαζόμαστε μια συγκεκριμένη έκδοση, έχουμε δύο τρόπους για να το κάνουμε αυτό. Ο πρώτος είναι να χρησιμοποιήσουμε το sdk use
κάθε φορά που θέλουμε να χρησιμοποιήσουμε μια συγκεκριμένη έκδοση ενός εργαλείου στο τρέχον τερματικό. Το δεύτερο είναι να προετοιμάσουμε μια λίστα εκδόσεων σε ένα .sdkmanrc
αρχείο που είναι αποθηκευμένο με το έργο.
Ενώ η πρώτη επιλογή είναι για μεμονωμένη χρήση, η δεύτερη είναι σχεδιασμένη για εργασία με ομάδες και κοινή χρήση διαμορφώσεων μεταξύ ομάδα μέλη.
Το SDKMAN! είναι πολύ εύκολο στη χρήση και διαθέτει μια πλούσια βιβλιοθήκη υποστηριζόμενων εργαλείων, πλαισίων και γλωσσών. Λειτουργεί σε Linux, MacOS και Windows. Από την άλλη πλευρά, αυτό το εργαλείο είναι εστιασμένο στην JVM και απαιτεί την αποδοχή του συγγραφέα να είναι πωλητής. Επιπλέον, ο μηχανικός του .sdkmanrc
είναι πολύ κακή και μπορεί να επιβραδύνει σημαντικά τη διαδικασία αλλαγής καταλόγων.
Εάν πρέπει να χρησιμοποιήσετε πολλές γλώσσες και εργαλεία, θα πρέπει να ρίξετε μια ματιά στο asdf. Αυτό το εργαλείο επικεντρώνεται σε εργαλεία "υψηλού επιπέδου". Ενώ στο SDKMAN! μπορείτε να βρείτε πολλά εργαλεία ειδικά για Java, όπως το Bpipe ή το Znai, το asdf προσφέρει πολύ περισσότερα εργαλεία αλλά όχι τόσο συγκεκριμένα. Φυσικά, ορισμένα από αυτά τα εργαλεία επικαλύπτονται, π.χ. η Java, το Tomcat ή το mvnd είναι διαθέσιμα και στα δύο.
Όταν θα θέλατε να χρησιμοποιήσετε asdf
, πρέπει να έχετε git
και curl
εγκατεστημένο. Μετά από αυτό, απλά:
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2
και προσθέστε αυτές τις γραμμές στο ~/.bashrc
file:
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash
Τώρα μπορείτε να εγκαταστήσετε πρόσθετα και εργαλεία στις αγαπημένες σας εκδόσεις.
Σε αντίθεση με το SDKMAN!, asdf
χρησιμοποιεί πρόσθετα για τη διαχείριση εργαλείων. Έτσι, πριν μπορέσετε να εγκαταστήσετε ένα εργαλείο, πρέπει να εγκαταστήσετε ένα πρόσθετο. Ας επιστρέψουμε στο έργο του παραδείγματός μας και ας προσπαθήσουμε να ρυθμίσουμε το περιβάλλον χρησιμοποιώντας asadfsdf
.
Πρώτα, πρέπει να εγκαταστήσουμε τα πρόσθετα:
asdf plugin add java
asdf plugin add maven
asdf plugin add mvnd
Στη συνέχεια μπορούμε να εγκαταστήσουμε τα εργαλεία μας:
asdf install java openjdk-17
asdf install maven 3.8.4
asdf install mvnd 0.7.1
Και για άλλη μια φορά, σε αντίθεση με το SDKMAN!, asdf
δεν αλλάζει τίποτα στο περιβάλλον μας. Όταν προσπαθούμε να χρησιμοποιήσουμε τη java, λαμβάνουμε ένα μήνυμα σφάλματος όπως:
Δεν έχει οριστεί έκδοση για την εντολή Java
Εξετάστε το ενδεχόμενο να προσθέσετε μία από τις παρακάτω εκδόσεις στο αρχείο ρυθμίσεων στο ~/.tool-versions
java openjdk-17
Πρέπει να δημιουργήσουμε το αρχείο .tool-versions
στον αρχικό κατάλογο για τη διαχείριση των προεπιλεγμένων εκδόσεων.
Ενημέρωση εκδόσεων λογισμικού με asdf
είναι αρκετά απλή. Απλά εγκαθιστούμε μια νέα έκδοση. Επειδή αυτή η διαδικασία δεν επηρεάζει το περιβάλλον, μπορούμε να το κάνουμε ανά πάσα στιγμή και σε οποιοδήποτε σημείο του συστήματος αρχείων. Όταν θέλουμε να χρησιμοποιήσουμε μια συγκεκριμένη έκδοση κάποιου λογισμικού, πρέπει να δημιουργήσουμε στον κατάλογο project ένα .tool-versions
αρχείο που μπορεί να μοιραστεί μεταξύ των μελών της ομάδας. Να θυμάστε ότι πρέπει να εγγυηθείτε ότι όλα τα μέλη της ομάδας έχουν asdf
και τα πρόσθετα που είναι εγκατεστημένα. Η λίστα των πρόσθετων που μπορείτε να βρείτε εδώ.
asdf
υποστηρίζει όχι μόνο γλώσσες προγραμματισμού, πλαίσια και εργαλεία όπως το vim ή το kubernetess. Υποστηρίζει και βάσεις δεδομένων. Σε μια τέτοια περίπτωση, θα μπορούσαμε να εγκαταστήσουμε πολλαπλές εκδόσεις π.χ. του Postgres, αλλά μόνο μια παρουσία θα μπορούσε να τρέξει. Αυτό συμβαίνει επειδή asdf
εκτελεί εντολές απευθείας στο λειτουργικό σας σύστημα χωρίς κανένα επίπεδο διαχωρισμού. Αυτό οδηγεί σε προβλήματα όπως "θύρα που χρησιμοποιείται ήδη" και συγκρούσεις σε πόρους.
asdf
είναι ένα πολύ καλό εργαλείο αν θέλετε να εργαστείτε σε ένα πολυγλωσσικό περιβάλλον. Υποστηρίζει πολλά εργαλεία, γλώσσες και πλαίσια. Η αρχιτεκτονική που βασίζεται σε πρόσθετα καθιστά πολύ εύκολη την επέκτασή του. Ωστόσο, ορισμένα από τα εργαλεία που έχει στη βιβλιοθήκη του χρειάζονται πρόσθετη εργασία κατά την εγκατάσταση για να παρέχουν όλες τις απαιτούμενες εξαρτήσεις. asdf
δεν λειτουργεί στα Windows, ακόμη και στα WSL.
Όταν μιλάω για τη σύγκρουση λιμανιών παραπάνω, πολλοί από εσάς γνωρίζετε τη λύση.
Docker θα μπορούσε να μας βοηθήσει σε ορισμένες περιπτώσεις. Το αναφέρω από καθήκον, επειδή αυτό το εργαλείο είναι τόσο μεγάλο και πολύπλοκο που δεν μπορούμε να το συζητήσουμε σε ένα άρθρο.
Μαζί με το Docker, θα πρέπει να χρησιμοποιήσουμε ένα docker-compose εργαλείο που μας δίνει τη δυνατότητα να συντονίσουμε περιβάλλοντα με πολλά δοχεία.
Το Docker μας βοηθά να διαχειριστούμε εργαλεία που χρειάζονται κάποιους συγκεκριμένους πόρους, όπως θύρες ή αρχεία. Διαχωρίζει τις περιπτώσεις σε κοντέινερ και μας δίνει πλήρη έλεγχο πάνω τους. Παρ' όλα αυτά, το Docker είναι ένα εργαλείο που εισάγει μεγάλη πολυπλοκότητα στο περιβάλλον εργασίας μας και θα μπορούσε να είναι προβληματικό σε ορισμένες περιπτώσεις. Μια από αυτές τις περιπτώσεις χρήσης του Docker σε μια δοκιμή περιγράφεται σε μια από τις προηγούμενες άρθρο.
Ξέρω ότι δεν περιέγραψα όλα τα εργαλεία που μπορούν να χρησιμοποιηθούν για τη διαχείριση των εκδόσεων εργαλείων. Υπάρχουν πολλά περισσότερα από αυτά, όπως jEnv που θα μπορούσε να αντικαταστήσει το SDKMAN,
ή NVM που μπορούμε να χρησιμοποιήσουμε για να διαχειριστούμε το npm ή RVM για το Ruby. Επικεντρώθηκα σε εργαλεία που "δοκίμασα στο πεδίο της μάχης" και μπορώ να τα συστήσω σε οποιονδήποτε.