Erste Schritte bei der Cloudentwicklung mit Java in Azure

In diesem Artikel werden die Schritte zum Einrichten einer Entwicklungsumgebung für die Azure-Entwicklung in Java erläutert. Anschließend erstellen Sie Azure-Ressourcen und stellen Verbindungen mit ihnen her, um einige allgemeine Aufgaben (etwa Hochladen einer Datei oder Bereitstellen einer Webanwendung) auszuführen. Wenn Sie fertig sind, können Sie Azure-Dienste in Ihren eigenen Java-Anwendungen verwenden.

Voraussetzungen

Einrichten der Authentifizierung

Ihre Java-Anwendung benötigt Lese- und Erstellungsberechtigungen in Ihrem Azure-Abonnement, um den Beispielcode in diesem Lernprogramm auszuführen. Erstellen Sie einen Dienstprinzipal, und konfigurieren Sie Ihre Anwendung so, dass sie mit dessen Anmeldeinformationen ausgeführt wird. Dienstprinzipale ermöglichen die Erstellung eines nicht interaktiven, Ihrer Identität zugeordneten Kontos, dem Sie nur die Berechtigungen erteilen, die zum Ausführen Ihrer App erforderlich sind.

Erstellen Sie einen Dienstprinzipal mithilfe der Azure CLI 2.0, und erfassen Sie die Ausgabe:

az ad sp create-for-rbac \
    --name AzureJavaTest \
    --role Contributor \
    --scopes /subscriptions/<your-subscription-ID>

Mit diesem Befehl erhalten Sie eine Antwort im folgenden Format:

{
  "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "displayName": "AzureJavaTest",
  "name": "http://AzureJavaTest",
  "password": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
  "tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}

Konfigurieren Sie als Nächstes die Umgebungsvariablen:

  • AZURE_SUBSCRIPTION_ID: Verwenden Sie den ID-Wert aus az account show der Azure CLI 2.0.
  • AZURE_CLIENT_ID: Verwenden Sie den AppId-Wert aus der Ausgabe, die aus einer Dienstprinzipalausgabe stammt.
  • AZURE_CLIENT_SECRET: Verwenden Sie den Kennwortwert aus der Ausgabe des Dienstprinzipals.
  • AZURE_TENANT_ID: Verwenden Sie den Mandantenwert aus der Dienstprinzipalausgabe.

Weitere Authentifizierungsoptionen finden Sie unter Azure-Identitätsclientbibliothek für Java.

Tools

Erstellen eines neuen Maven-Projekts

Hinweis

In diesem Artikel wird das Maven-Buildtool verwendet, um den Beispielcode zu erstellen und auszuführen. Andere Buildtools (beispielsweise Gradle) können ebenfalls mit dem Azure SDK für Java verwendet werden.

Erstellen Sie über die Befehlszeile ein Maven-Projekt in einem neuen Verzeichnis Ihres Systems.

mkdir java-azure-test
cd java-azure-test
mvn archetype:generate -DgroupId=com.fabrikam -DartifactId=AzureApp \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Mit diesem Schritt wird ein einfaches Maven-Projekt im Verzeichnis testAzureApp erstellt. Fügen Sie dem der Datei pom.xml des Projekts die folgenden Einträge hinzu, um die Bibliotheken zu importieren, die im Beispielcode dieses Tutorials verwendet werden.

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-identity</artifactId>
  <version>1.3.2</version>
</dependency>
<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-storage-blob</artifactId>
  <version>12.8.0</version>
</dependency>
<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>6.2.1.jre8</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.33</version>
</dependency>

Fügen Sie unter dem Element project der obersten Ebene einen Eintrag vom Typ build hinzu, um die Beispiele mithilfe von maven-exec-plugin auszuführen. maven-compiler-plugin wird verwendet, um den Quellcode und generierte Klassen für Java 8 zu konfigurieren.

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>3.0.0</version>
      <configuration>
        <mainClass>com.fabrikam.App</mainClass>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
  </plugins>
</build>

Erstellen einer virtuellen Linux-Maschine

Erstellen Sie eine neue Datei namens "App.java" im Verzeichnis "src/Standard/java/com/com/fabrikam", und fügen Sie den folgenden Codeblock ein. Aktualisieren Sie die Variablen userName und sshKey mit echten Werten für Ihren Computer. Durch den Code wird in der Azure-Region „USA, Osten“ ein neuer virtueller Linux-Computer namens testLinuxVM in der Ressourcengruppe sampleResourceGroup erstellt.

package com.fabrikam;

import com.azure.core.credential.TokenCredential;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.management.AzureEnvironment;
import com.azure.core.management.Region;
import com.azure.core.management.profile.AzureProfile;
import com.azure.identity.AzureAuthorityHosts;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.resourcemanager.AzureResourceManager;
import com.azure.resourcemanager.compute.models.KnownLinuxVirtualMachineImage;
import com.azure.resourcemanager.compute.models.VirtualMachine;
import com.azure.resourcemanager.compute.models.VirtualMachineSizeTypes;

public class App {

    public static void main(String[] args) {

        final String userName = "YOUR_VM_USERNAME";
        final String sshKey = "YOUR_PUBLIC_SSH_KEY";

        try {
            TokenCredential credential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(credential, profile)
                    .withDefaultSubscription();

            // Create an Ubuntu virtual machine in a new resource group.
            VirtualMachine linuxVM = azureResourceManager.virtualMachines().define("testLinuxVM")
                    .withRegion(Region.US_EAST)
                    .withNewResourceGroup("sampleVmResourceGroup")
                    .withNewPrimaryNetwork("10.0.0.0/24")
                    .withPrimaryPrivateIPAddressDynamic()
                    .withoutPrimaryPublicIPAddress()
                    .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_18_04_LTS)
                    .withRootUsername(userName)
                    .withSsh(sshKey)
                    .withSize(VirtualMachineSizeTypes.STANDARD_D3_V2)
                    .create();

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

Führen Sie das Beispiel über die Befehlszeile aus:

mvn compile exec:java

In der Konsole werden einige REST-Anforderungen und Antworten angezeigt, während das SDK die zugrunde liegenden Aufrufe an die REST-API sendet, um den virtuellen Computer und die zugehörigen Ressourcen zu konfigurieren. Überprüfen Sie nach Abschluss des Programms den virtuellen Computer unter Ihrem Abonnement mithilfe der Azure CLI 2.0:

az vm list --resource-group sampleVmResourceGroup

Nachdem Sie sich vergewissert haben, dass der Code erfolgreich ausgeführt wurde, können Sie den virtuellen Computer und dessen Ressourcen über die Befehlszeile löschen:

az group delete --name sampleVmResourceGroup

Bereitstellen einer Web-App aus einem GitHub-Repository

Ersetzen Sie die Standard-Methode in App.java durch den folgenden. Aktualisieren Sie die Variable appName auf einen eindeutigen Wert, bevor Sie den Code ausführen. Dieser Code stellt eine Webanwendung aus der Verzweigung master in einem öffentlichen GitHub-Repository für eine neue Azure App Service-Web-App bereit, die unter dem Tarif „Free“ ausgeführt wird.

    public static void main(String[] args) {
        try {

            final String appName = "YOUR_APP_NAME";

            TokenCredential credential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
            
            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(credential, profile)
                    .withDefaultSubscription();

            WebApp app = azureResourceManager.webApps().define(appName)
                    .withRegion(Region.US_WEST2)
                    .withNewResourceGroup("sampleWebResourceGroup")
                    .withNewWindowsPlan(PricingTier.FREE_F1)
                    .defineSourceControl()
                    .withPublicGitRepository(
                            "https://github.com/Azure-Samples/app-service-web-java-get-started")
                    .withBranch("master")
                    .attach()
                    .create();

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

Führen Sie den Code wie zuvor mit Maven aus:

mvn clean compile exec:java

Öffnen Sie die Anwendung über die Befehlszeilenschnittstelle in einem Browser:

az webapp browse --resource-group sampleWebResourceGroup --name YOUR_APP_NAME

Entfernen Sie die Web-App und den Plan aus Ihrem Abonnement, nachdem Sie die Bereitstellung überprüft haben:

az group delete --name sampleWebResourceGroup

Herstellen einer Verbindung mit einer Azure SQL-Datenbank

Ersetzen Sie die aktuelle Standard-Methode in App.java durch den folgenden Code. Legen Sie für die Variablen echte Werte fest. Durch diesen Code wird eine neue SQL-Datenbank mit einer Firewallregel erstellt, die Remotezugriffe zulässt. Anschließend wird durch den Code unter Verwendung des JBDC-Treibers der SQL-Datenbank eine Verbindung mit der Datenbank hergestellt.

    public static void main(String args[]) {
        // Create the db using the management libraries.
        try {
            TokenCredential credential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(credential, profile)
                    .withDefaultSubscription();

            final String adminUser = "YOUR_USERNAME_HERE";
            final String sqlServerName = "YOUR_SERVER_NAME_HERE";
            final String sqlDbName = "YOUR_DB_NAME_HERE";
            final String dbPassword = "YOUR_PASSWORD_HERE";
            final String firewallRuleName = "YOUR_RULE_NAME_HERE";

            SqlServer sampleSQLServer = azureResourceManager.sqlServers().define(sqlServerName)
                    .withRegion(Region.US_EAST)
                    .withNewResourceGroup("sampleSqlResourceGroup")
                    .withAdministratorLogin(adminUser)
                    .withAdministratorPassword(dbPassword)
                    .defineFirewallRule(firewallRuleName)
                        .withIpAddressRange("0.0.0.0","255.255.255.255")
                        .attach()
                    .create();

            SqlDatabase sampleSQLDb = sampleSQLServer.databases().define(sqlDbName).create();

            // Assemble the connection string to the database.
            final String domain = sampleSQLServer.fullyQualifiedDomainName();
            String url = "jdbc:sqlserver://"+ domain + ":1433;" +
                    "database=" + sqlDbName +";" +
                    "user=" + adminUser+ "@" + sqlServerName + ";" +
                    "password=" + dbPassword + ";" +
                    "encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";

            // Connect to the database, create a table, and insert an entry into it.
            try (Connection conn = DriverManager.getConnection(url)) {
                String createTable = "CREATE TABLE CLOUD (name varchar(255), code int);";
                String insertValues = "INSERT INTO CLOUD (name, code) VALUES ('Azure', 1);";
                String selectValues = "SELECT * FROM CLOUD";
                try (Statement createStatement = conn.createStatement()) {
                    createStatement.execute(createTable);
                }
                try (Statement insertStatement = conn.createStatement()) {
                    insertStatement.execute(insertValues);
                }
                try (Statement selectStatement = conn.createStatement();
                     ResultSet rst = selectStatement.executeQuery(selectValues)) {
                    while (rst.next()) {
                        System.out.println(rst.getString(1) + " " + rst.getString(2));
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println(e.getStackTrace().toString());
        }
    }

Führen Sie das Beispiel über die Befehlszeile aus:

mvn clean compile exec:java

Bereinigen Sie die Ressourcen anschließend über die Befehlszeilenschnittstelle:

az group delete --name sampleSqlResourceGroup

Schreiben eines Blobs in ein neues Speicherkonto

Ersetzen Sie die aktuelle Standard-Methode in App.java durch den folgenden Code. Durch diesen Code wird ein Azure-Speicherkonto erstellt. Anschließend wird unter Verwendung der Azure Storage-Bibliotheken für Java eine neue Textdatei in der Cloud erstellt.

    public static void main(String[] args) {

        try {
            TokenCredential tokenCredential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(tokenCredential, profile)
                    .withDefaultSubscription();

            // Create a new storage account.
            String storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME_HERE";
            StorageAccount storage = azureResourceManager.storageAccounts().define(storageAccountName)
                    .withRegion(Region.US_WEST2)
                    .withNewResourceGroup("sampleStorageResourceGroup")
                    .create();

            // Create a storage container to hold the file.
            List<StorageAccountKey> keys = storage.getKeys();
            PublicEndpoints endpoints = storage.endPoints();
            String accountName = storage.name();
            String accountKey = keys.get(0).value();
            String endpoint = endpoints.primary().blob();

            StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);

            BlobServiceClient storageClient = new BlobServiceClientBuilder()
                    .endpoint(endpoint)
                    .credential(credential)
                    .buildClient();

            // Container name must be lowercase.
            BlobContainerClient blobContainerClient = storageClient.getBlobContainerClient("helloazure");
            blobContainerClient.create();

            // Make the container public.
            blobContainerClient.setAccessPolicy(PublicAccessType.CONTAINER, null);

            // Write a blob to the container.
            String fileName = "helloazure.txt";
            String textNew = "Hello Azure";

            BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
            InputStream is = new ByteArrayInputStream(textNew.getBytes());
            blobClient.upload(is, textNew.length());

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

Führen Sie das Beispiel über die Befehlszeile aus:

mvn clean compile exec:java

Sie können über das Azure-Portal oder mit dem Azure Storage-Explorer zur Datei helloazure.txt in Ihrem Speicherkonto navigieren.

Bereinigen Sie das Speicherkonto über die Befehlszeilenschnittstelle:

az group delete --name sampleStorageResourceGroup

Erkunden weiterer Beispiele

Weitere Informationen zur Ressourcenverwaltung und Aufgabenautomatisierung mit den Azure-Verwaltungsbibliotheken für Java finden Sie in unserem Beispielcode für virtuelle Computer, Web-Apps und SQL-Datenbank.

Referenz und Versionshinweise

Für alle Pakete steht eine Referenz zur Verfügung.

Hilfe und Feedback

Stellen Sie in Stack Overflow Fragen an die Community. Melden Sie Fehler und Probleme im Zusammenhang mit dem Azure SDK für Java im GitHub-Repository.