Best Practices für Java

Es ist wichtig und schwierig, Ihre Anwendungen auf dem neuesten Stand zu halten. In diesem Dokument werden einige grundlegende Schritte beschrieben, die Java-Entwicklern mit den DevOps-Praktiken beginnen können. Diese Liste ist nicht vollständig. Die meisten dieser Ideen stammen aus den DORA-DevOps-Forschungs- und -Bewertungsstudien, die einen vollständigen Überblick über Best Practices bieten. Andere Quellen sind unter anderem Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations von Nicole Forsgren PhD, Jez Humble und Gene Kim und Software Engineering at Google, zusammengestellt von Titus Winters, Tom Manshreck und Hyrum Wright

Bevor Sie diese Seite lesen, sollten Sie den Artikel Java-Entwicklungsumgebung einrichten lesen.

Die Anforderungen jeder Entwicklungsorganisation sind individuell, aber ein einfaches System könnte mit einem der folgenden Softwarepakete konstruiert werden:

Beispieltechnologie-Stack 1 Beispieltechnologie-Stack 2
  • Cloud Source Repositories, GitHub oder Bitbucket für Quellcode.
  • Whitesource RenovateBot, um Artefakte und Bibliotheken auf dem neuesten Stand zu halten.
  • Cloud Build für Einheiten-/Vorabtesttests
  • Cloud Build für Integrationstests
  • Cloud Build für die Bereitstellung
  • GitHub für Quellcode.
  • GitHub-Dependabot zum Aktualisieren der Artefakte und Bibliotheken.
  • GitHub Actions zum Vorabsenden von Tests
  • GitHub Actions für Integrationstests
  • GitHub-Aktionen für die Bereitstellung

Mit einem einfachen System, das mit diesen Komponenten erstellt wird, können Sie die Qualität und die Zykluszeit verbessern. Außerdem können Sie Ihren Code ganz einfach mit den neuesten Fehlerkorrekturen und Sicherheitsupdates auf dem neuesten Stand halten.

Versionsverwaltung

Forschung (Seite 17 ,Seite 14 ,Seite 31 und Seite 60) wurde festgestellt, dass Versionsverwaltung für den Quellcode in Kombination mit Automatisierung und Tests verbesserte Qualität und viele andere Vorteile voraussagt.

GitHub, Gitlab und Bitbucket eignen sich auch gut für Ihren Quellcode.

Automatisierte Tests

Kontinuierliche Tests können für die meisten dieser Verfahren entscheidend für Ihren Erfolg sein. Weitere Informationen zum Testen von Best Practices finden Sie im SRE-Kapitel über Zuverlässigkeitstests und im Google Testing-Blog.

Java-Entwickler interessieren sich hauptsächlich für automatisierte Einheitentests und Integrationstests. JUnit, Testen mit Spring, Apache Maven Surefire und Gradle Java-Tests sind nützliche Ressourcen für Java-Entwickler.

Kontinuierliche Integration und Bereitstellungsautomatisierung

Continuous Integration und Bereitstellungsautomatisierung unterstützen moderne DevOps-Jobs. Erstellen, testen und bereitstellen

  • Cloud Build [QuickStarts ] [Java-spezifisch ] [Bereitstellung ] [Trigger] bietet ein kostenloses (120 Build-Minuten / Tag) oder kostengünstiges Build-System, das für die meisten Jobs einfach angepasst werden kann.
  • Tekton ist ein Open-Source-Projekt, mit dem Sie die Cloud Build-Ideen einfach an Ihre Systeme anpassen können.
  • Spinnaker ist eine Open-Source-Multi-Cloud-Plattform für Continuous Delivery, mit der Sie Softwareänderungen schnell und zuverlässig veröffentlichen können. Es unterstützt Sie dabei, komplexe Softwaresysteme freizugeben und ein Rollback durchzuführen.
  • GitHub's Actions ist eine Drittanbieterlösung, mit der Sie ganz einfach Tests einrichten und auf GitHub ausführen können.
  • Es gibt auch viele andere Lösungen wie Gitlab, Circle CI und Travis CI.

Cloud-Clientbibliotheken

Es gibt viele Möglichkeiten für die Verwendung von Google-Diensten. Am besten folgen Sie der Anleitung auf der Seite Cloud-Clientbibliotheken. Bei Java kann die Libraries-BOM dafür sorgen, dass Sie kompatible Versionen der einzelnen Artefakte verwenden.

Wenn Sie eigene Versionen von Clientbibliotheken auswählen, ist es möglich, dass ein inkompatibles Artefakt ausgewählt wird. Dies wird als Diamantabhängigkeitsproblem bezeichnet. Wenn Sie dennoch Ihre einzelnen Bibliotheken auswählen müssen, aktualisieren Sie diese einzeln und testen Sie, ob bei der Aktualisierung ein Fehler aufgetreten ist. Die neuesten Versionen werden immer auf dieser Seite aufgelistet oder Sie finden sie über die Maven-Central.

Abhängigkeiten auf dem neuesten Stand halten

Zum Schutz vor böswilligen Akteuren ist es wichtig, dass Sie Ihre Abhängigkeiten auf dem neuesten Stand halten. Es gibt viele Tools von Drittanbietern, die Ihnen dabei helfen können:

Wenn diese Tools ordnungsgemäß konfiguriert sind, können Sie Ihre Abhängigkeiten auf dem neuesten Stand halten. Wenn Sie automatisierte Tests und Continuous Integration / Continuous Deployment kombinieren, wird der Ablauf:

  • Die Abhängigkeitsautomatisierung schlägt eine Änderung der Versionsverwaltung vor.
  • Das kontinuierliche Build-System erstellt und testet die Änderung.
  • Ein Mensch prüft den Vorschlag und akzeptiert gegebenenfalls die Änderung, zusammen mit anderen Änderungen.
  • Nachdem die Änderungen akzeptiert wurden, wird ein Angebot an das Continuous Delivery-System gesendet, um den Code für die Produktion freizugeben. Alternativ können Sie Ihren benutzerdefinierten Prozess befolgen.

Unterstützte Java-Laufzeitumgebung (JRE) verwenden

Die JRE, eine Teilmenge des Java Development Kits, befindet sich auf Ihrem Betriebssystem und bietet die Software und Ressourcen, die zum Ausführen einer Java-Anwendung erforderlich sind. Die meisten Nutzer bevorzugen in der Produktion die neueste LTS-Version, damit sie Zugriff auf Updates, Sicherheit und Fehlerkorrekturen haben. Normalerweise ist es möglich, auf eine neuere JRE zu aktualisieren, auch wenn Ihr Code für ein früheres JDK kompiliert wurde.

Wenn Sie mit mehreren JDK-Versionen arbeiten, kann Ihnen SDKMAN! verschiedene JDK-Versionen verwenden und verwalten.

Container verwenden (Google Kubernetes Engine-, Cloud Run-, Anthos-Cluster)

Wenn Sie Docker-Container mit RenovateBot oder DependaBot verwenden, schlägt der Bot regelmäßig Aktualisierungen für Ihr JRE und Ihr JDK vor. Sie sollten das JDK und die JRE auf derselben Version halten.

Wir empfehlen die Verwendung von Jib, um Ihre Java-Anwendungen in den meisten Fällen zu containerisieren.

Wenn Sie das Dockerfile manuell aktualisieren, ändern Sie einfach die JRE auf die neueste Version und erstellen Sie sie neu.

Compute Engine verwenden

Dies ist in der Regel sehr anwendungsspezifisch. Wir empfehlen die Verwendung eines Startskripts. Zum Aktualisieren müssen Sie das Skript aktualisieren.

Flexible App Engine-Umgebung

Unterstützt nur Java 8.

App Engine Standard

App Engine-Anwendung von Java 8 zu Java 11 migrieren

LTS-Version des Java Development Kits verwenden

Das JDK besteht aus einer Reihe von Tools zur Entwicklung von Java-Anwendungen. Neue Sprachfunktionen sind an ein bestimmtes JDK gebunden. Wir empfehlen, Ihre Nutzung an ein JDK mit Langzeitsupport (LTS) anzuheften und auf die nächste LTS-Version zu aktualisieren, wenn dies für Ihre Anwendung geeignet ist. Wir empfehlen die Verwendung des neuesten Nebenrelease des angepinnten Haupt-LTS-Release.

Die meisten Nutzer möchten JDK und JRE synchronisieren. Manchmal ist dies nicht möglich, z. B. wenn das JDK nicht mehr unterstützt wird. Sie müssen dann ein späteres JDK kompilieren und auf einer früheren JRE ausgeführt werden.

Mit Maven:

Legen Sie die Sprachebene fest, in der Sie codieren möchten, und die Ziel-JRE. Aktualisieren Sie die Datei pom.xml so (für Java 8): xml <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>

Zum Aktualisieren auf Java 11 ändern Sie es so:

    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

Wenn Sie Gradle verwenden, aktualisieren Sie die Datei build.gradle für Java 8 mit:

compileJava {
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
}

Oder für Java 11:

compileJava {
  sourceCompatibility = 11
  targetCompatibility = 11
}

Beachten Sie, dass für Java 8 und frühere Versionen die Präfix 1. (1.7 für Java 7, 1.8 für Java 8) vorhanden war, die nach Java 8 verworfen wurde.