9 zu vermeidende Fehler bei der Programmierung in Java
Welche Fehler sollten bei der Programmierung in Java vermieden werden? Im folgenden Beitrag beantworten wir diese Frage.
Gibt es einen goldenen Mittelweg, um viele Umgebungen für eine große Anzahl auf nur einem Rechner zu verwalten? Unser Java-Experte Bartłomiej kennt die Antwort!
Werfen wir einen Blick auf eine typische Arbeitsumgebung in einer Softwarehaus. Sie haben einige Kunden, die unterschiedliche Umgebungen haben. Einige bevorzugen MySQL, andere Postgres. Eine Version Ihrer Anwendung benötigt Java 11 und ein weiteres Java 17. Frontend braucht npm 12 oder 16, weil Sie verschiedene Versionen von eckig. Schließlich haben Sie das dreidimensionale Array, das Kombinationen aller Ihrer DBs, Backend- und Frontend-Versionen enthält. Klingt schlimm, aber eines Tages sagt Ihr Chef...
Die oben beschriebene Situation ist keine Seltenheit. Migrationen zwischen Sprach- oder Framework-Versionen, Aktualisierungen von Datenbanken oder einfach unterschiedliche Anforderungen von Kunden können alle Konfigurationen auf den Kopf stellen. Wir sollten eine Lösung haben, die uns hilft, diese Änderungen zu verwalten, eine Lösung, die ein paar Annahmen und/oder Anforderungen und/oder Ziele erfüllt:
In diesem Artikel werde ich mich auf drei Bereiche konzentrieren. Erstens: Werkzeuge für Java und die JVM. Der zweite Bereich sind Werkzeuge für allgemeine Zwecke. Und drittens geht es darum, wie wir Docker zum Erreichen unserer Ziele einsetzen können.
Wenn Sie ein Java-Entwickler oder, allgemeiner ausgedrückt, Sie arbeiten mit JVM-Technologiendann können Sie SDKMAN!. Dies ist ein sehr schönes und einfach zu bedienendes Tool, das viele Bibliotheken, Frameworks und Sprachen unterstützt.
Der Installationsprozess von SDKMAN! ist ziemlich einfach. Sie müssen laufen:
curl -s "https://get.sdkman.io" | bash
und dann
source "$HOME/.sdkman/bin/sdkman-init.sh"
Jetzt können Sie Ihre Java, Scala und Maven Versionen.
In diesem Beispiel werden wir die Version einiger Werkzeuge installieren und aktualisieren. Dies ist nur eine kleine Teilmenge der verfügbaren Tools.
Nehmen wir an, Ihr neues Projekt verwendet Java 17. Sie haben keine Java Version installiert. Sie möchten sie installieren und zusätzlich ein Maven Daemon Tool hinzufügen, um die Builds zu beschleunigen. Sie müssen also auch Maven installieren. Dazu müssen Sie drei einfache Befehle ausführen:
$ sdk installieren java 17-open
$ sdk installieren maven 3.8.4
$ sdk install mvnd 0.7.1
Am Ende der Installation eines jeden Tools werden Sie gefragt, ob Sie es als Standard festlegen möchten:
Wollen Sie, dass Java 17-open als Standard eingestellt wird (Y/n):
Dies ist wichtig, wenn Sie eine neue Version einer Bibliothek oder einer Sprache installieren, denn SDKMAN! setzt diese Standardversion als global für alle Terminals des aktuellen Benutzers.
Von Zeit zu Zeit muss SDKMAN! die Indizes aktualisieren. Dabei kann es vorkommen, dass Sie eine Meldung erhalten, dass es neue Versionen von Tools gibt, die Sie verwenden. Wir können überprüfen, welche Versionen verfügbar sind, indem wir Folgendes eingeben sdk ls
. Für sdk ls maven
:
Verfügbare Maven-Versionen
================================================================================
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
================================================================================
lokale Version
derzeit in Gebrauch
================================================================================
Wie wir oben sehen, hat Maven eine neuere Version als die, die wir verwenden. Das gleiche gilt für mvnd
(0.8.2) und Java (19-open). Lassen Sie uns alles aktualisieren. Dazu brauchen wir nur den Installationsbefehl aufzurufen, aber dieses Mal verwenden wir keinen Versionsspezifizierer:
$ sdk installieren maven
$ sdk installieren mvnd
$ sdk installieren java
Aber etwas ist schief gelaufen. Maven
und mvnd
haben korrekte Versionen, aber Java hat Version 17.0.5-tem
. Das liegt daran, dass die "neuste" Version des Tools vom Hersteller kontrolliert wird und nicht vom lokalen SDKMAN! Wer ist dieser Hersteller? Ein Anbieter in SDKMAN! ist jemand, der eine Version veröffentlichen kann. Wie auch immer, nehmen wir an, dass wir endlich installieren 19-geöffnet
und wir haben es zum Standard gemacht, aber aus irgendeinem Grund müssen wir die 17-geöffnet
.
Wir können eine Standard
Version eines Tools, die global für alle Projekte und Terminals gilt. Wenn wir jedoch eine bestimmte Version benötigen, haben wir zwei Möglichkeiten. Die erste ist die Verwendung der sdk verwenden
Befehl jedes Mal, wenn wir eine bestimmte Version eines Tools im aktuellen Terminal verwenden wollen. Die zweite Möglichkeit ist die Erstellung einer Versionsliste in einer .sdkmanrc
Datei, die mit dem Projekt gespeichert wird.
Während die erste Option für den Einzelgebrauch gedacht ist, ist die zweite für die Arbeit mit Teams und die gemeinsame Nutzung von Konfigurationen zwischen Team Mitglieder.
SDKMAN! ist sehr einfach zu bedienen und verfügt über eine umfangreiche Bibliothek von unterstützten Tools, Frameworks und Sprachen. Es funktioniert unter Linux, MacOS und Windows. Andererseits ist dieses Tool auf die JVM fokussiert und erfordert die Zustimmung des Autors, ein Anbieter zu sein. Darüber hinaus ist die Mechanik von .sdkmanrc
ist sehr dürftig und könnte den Prozess des Wechsels von Verzeichnissen erheblich verlangsamen.
Wenn Sie viele Sprachen und Werkzeuge verwenden müssen, sollten Sie einen Blick auf asdf. Dieses Tool ist auf "High-Level"-Tools ausgerichtet. Während man in SDKMAN! viele Java-spezifische Tools wie Bpipe oder Znai finden kann, bietet asdf viel mehr Tools, die aber nicht so spezifisch sind. Natürlich überschneiden sich einige dieser Werkzeuge, z.B. Java, Tomcat oder mvnd sind in beiden verfügbar.
Wenn Sie Folgendes verwenden möchten asdf
müssen Sie folgende Voraussetzungen erfüllen git
und locken.
installiert. Danach müssen Sie nur noch:
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2
und fügen Sie diese Zeilen ein ~/.bashrc
file:
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/Ergänzungen/asdf.bash
Jetzt können Sie Plugins und Tools in Ihren bevorzugten Versionen installieren.
Im Gegensatz zu SDKMAN! asdf
verwendet Plugins, um Werkzeuge zu verwalten. Bevor Sie also ein Werkzeug installieren können, müssen Sie ein Plugin installieren. Kehren wir zu unserem Beispielprojekt zurück und versuchen wir, die Umgebung zu konfigurieren, indem wir asadfsdf
.
Zunächst müssen wir Plugins installieren:
asdf plugin hinzufügen java
asdf plugin hinzufügen maven
asdf-Plugin mvnd hinzufügen
Dann können wir unsere Werkzeuge installieren:
asdf install java openjdk-17
asdf install maven 3.8.4
asdf install mvnd 0.7.1
Und noch einmal, im Gegensatz zu SDKMAN! asdf
ändert nichts an unserer Umgebung. Wenn wir versuchen, Java zu verwenden, erhalten wir eine Fehlermeldung wie:
Für den Befehl Java ist keine Version eingestellt
Fügen Sie eine der folgenden Versionen in Ihrer Konfigurationsdatei unter ~/.tool-versions hinzu
java openjdk-17
Wir müssen die Datei .tool-versionen
im Heimatverzeichnis, um die Standardversionen zu verwalten.
Aktualisierung der Softwareversionen mit asdf
ist ziemlich einfach. Wir installieren einfach eine neue Version. Da sich dieser Vorgang nicht auf die Umgebung auswirkt, können wir das jederzeit und an jeder beliebigen Stelle im Dateisystem tun. Wenn wir eine bestimmte Version einer Software verwenden wollen, müssen wir im Projektverzeichnis eine .tool-versionen
Datei, die von den Teammitgliedern gemeinsam genutzt werden kann. Denken Sie daran, dass Sie sicherstellen müssen, dass alle Teammitglieder über asdf
und Plugins installiert. Die Liste der Plugins, die Sie finden können hier.
asdf
unterstützt nicht nur Programmiersprachen, Frameworks und Tools wie vim oder kubernetess. Es unterstützt auch Datenbanken. In einem solchen Fall könnten wir mehrere Versionen von z. B. Postgres installieren, aber nur eine Instanz könnte laufen. Der Grund dafür ist asdf
führt Befehle direkt auf dem Betriebssystem aus, ohne eine Trennschicht. Das führt zu Problemen wie "Port bereits in Gebrauch" und Ressourcenkonflikten.
asdf
ist ein sehr gutes Werkzeug, wenn Sie in einer polyglotten Umgebung arbeiten möchten. Es unterstützt viele Tools, Sprachen und Frameworks. Die Plugin-basierte Architektur macht es sehr einfach, diese zu erweitern. Einige der Werkzeuge, die in der Bibliothek enthalten sind, erfordern jedoch zusätzliche Arbeit bei der Installation, um alle erforderlichen Abhängigkeiten bereitzustellen. asdf
funktioniert nicht unter Windows, auch nicht unter WSL.
Wenn ich oben über den Hafenkonflikt spreche, kennen viele von Ihnen die Lösung.
Docker könnte uns in einigen Fällen helfen. Ich erwähne es aus Pflichtgefühl, weil dieses Werkzeug so groß und komplex ist, dass wir es nicht in einem Artikel behandeln können.
Zusammen mit Docker sollten wir eine docker-compose Werkzeug, das uns die Möglichkeit gibt, Umgebungen mit mehreren Containern zu koordinieren.
Docker hilft uns bei der Verwaltung von Tools, die bestimmte Ressourcen, wie Ports oder Dateien, benötigen. Es trennt Instanzen in Container und gibt uns die volle Kontrolle über sie. Dennoch ist Docker ein Werkzeug, das eine Menge Komplexität in unsere Arbeitsumgebung einbringt und in einigen Fällen problematisch sein kann. Einer dieser Fälle der Verwendung von Docker in einem Test wird in einem unserer früheren Beiträge beschrieben Artikel.
Ich weiß, dass ich nicht alle Werkzeuge beschrieben habe, die für die Verwaltung von Werkzeugversionen verwendet werden können. Es gibt noch viel mehr davon, wie zum Beispiel jEnv die SDKMAN ersetzen könnte,
oder NVM die wir verwenden können, um npm zu verwalten oder RVM für Ruby. Ich habe mich auf Tools konzentriert, die ich "auf dem Schlachtfeld getestet" habe und jedem empfehlen kann.