Schreiben von gespeicherten Prozeduren in Java¶
Dieses Feature ermöglicht das Schreiben von gespeicherten Prozeduren in Java. Sie können die Snowpark-Bibliothek innerhalb Ihrer gespeicherten Prozedur verwenden, um Abfragen, Aktualisierungen und andere Arbeiten an Tabellen in Snowflake auszuführen.
In diesem Thema wird erläutert, wie Sie den Handler für eine gespeicherte Prozedur schreiben, der ihre Logik enthält. Sobald die Logik verfügbar ist, können Sie die Prozedur mit SQL erstellen und aufrufen. Weitere Informationen dazu finden Sie unter Erstellen einer gespeicherten Prozedur und Aufrufen einer gespeicherten Prozedur.
Unter diesem Thema:
Einführung¶
Mit gespeicherten Snowpark-Prozeduren können Sie Ihre Datenpipeline in Snowflake erstellen und ausführen, wobei ein Snowflake-Warehouse als Compute-Framework dient. Für den Code Ihrer Datenpipeline verwenden Sie die Snowpark-API für Java zum Schreiben der gespeicherten Prozeduren. Um die Ausführung dieser gespeicherten Prozeduren zu planen, verwenden Sie Aufgaben (Tasks).
Sie können während der Ausführung Ihres Handler-Codes Protokoll- und Ablaufverfolgungsdaten erfassen. Weitere Informationen dazu finden Sie unter Übersicht zu Protokollierung und Ablaufverfolgung.
Bemerkung
Um eine anonyme Prozedur sowohl zu erstellen als auch aufzurufen, verwenden Sie CALL (mit anonymen Prozeduren). Das Erstellen und Aufrufen einer anonymen Prozedur erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.
Voraussetzungen¶
Sie müssen Version 1.3.0 oder eine neuere Version der Snowpark-Bibliothek verwenden.
Wenn Sie eine gespeicherte Prozedur schreiben, müssen Sie Ihre Klassen für die Ausführung in folgenden Java-Versionen kompilieren:
11.x
17.x (Dieses Feature steht allen Konten als Vorschau zur Verfügung.)
Einrichten Ihrer Entwicklungsumgebung für Snowpark¶
Richten Sie Ihre Entwicklungsumgebung für die Verwendung der Snowpark-Bibliothek ein. Siehe Einrichten Ihrer Entwicklungsumgebung für Snowpark Java.
Strukturieren und Erstellen von Handler-Code¶
Sie können den Handler-Quellcode inline mit demSQL-Code aufbewahren, der die Prozedur erstellt, oder das kompilierte Ergebnis des Handlers an einem separaten Ort aufbewahren und von SQL aus referenzieren. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
Weitere Informationen zum Erstellen von Handler-Quellcode zur Verwendung mit einer Prozedur finden Sie unter Packen des Handler-Codes.
Erstellen und Aufrufen von Prozeduren¶
Sobald Sie den Handler für eine Prozedur geschrieben haben, können Sie ihn erstellen und mit SQL aufrufen.
Erstellen der gespeicherten Prozedur
Informationen zum Erstellen einer gespeicherten Prozedur mit SQL finden Sie unter Erstellen einer gespeicherten Prozedur.
Informationen zum Erstellen einer anonymen Prozedur mit SQL finden Sie unter CALL (mit anonymen Prozeduren).
Aufrufen einer gespeicherten Prozedur
Informationen zum Aufrufen einer gespeicherten Prozedur aus SQL finden Sie unter Aufrufen einer gespeicherten Prozedur.
Einschränkungen¶
In dieser Vorschau bestehen für gespeicherte Snowpark-Prozeduren die folgenden Einschränkungen:
Parallelität wird nicht unterstützt. So können Sie beispielsweise über Ihren Code keine Abfragen von mehreren Threads übermitteln. Code, der mehrere Abfragen gleichzeitig ausführt, führt zu einem Fehler.
Wenn Sie Ihre gespeicherte Prozedur von einer Aufgabe aus ausführen, müssen Sie beim Erstellen der Aufgabe ein Warehouse angeben. (Sie können zum Ausführen der Aufgabe keine serverlosen Computeressourcen verwenden.)
Beachten Sie die folgenden Einschränkungen für die Verwendung von Snowpark-APIs in Ihrer gespeicherten Prozedur.
Wenn Sie APIs verwenden, die PUT- und GET-Befehle ausführen (einschließlich
Session.sql("PUT ...")
undSession.sql("GET ...")
), dürfen Sie nur in das Verzeichnis „/tmp“ des speichergestützten Dateisystems schreiben, das für die Abfrage vorgesehen ist, das die Prozedur aufruft.Verwenden Sie keine APIs für asynchrone Aktionen.
Verwenden Sie keine APIs, die neue Sitzungen erstellen (z. B.
Session.builder().configs(...).create()
).Die Verwendung von
session.jdbcConnection
(und der zurückgegebenen Verbindung) wird nicht unterstützt, da dies zu unsicherem Verhalten führen kann.
Das Erstellen benannter temporärer Objekte wird in einer gespeicherten Prozedur mit Eigentümerrechten nicht unterstützt. Eine gespeicherte Prozedur mit Eigentümerrechten ist eine gespeicherte Prozedur, die mit den Berechtigungen des Eigentümers der gespeicherten Prozedur ausgeführt wird. Weitere Informationen dazu finden Sie unter Aufruferrechte oder Eigentümerrechte.
Schreiben des Handler-Codes für die gespeicherte Prozedur¶
Für die Logik der Prozedur schreiben Sie Handler-Code, der bei Aufruf der Prozedur ausgeführt wird. In diesem Abschnitt wird das Design eines Handlers beschrieben.
Sie können diesen Code in die SQL-Anweisung einfügen, mit der die Prozedur erstellt wird, oder Sie kopieren den Code in einen Stagingbereich und referenzieren ihn dort, wenn Sie die Prozedur erstellen. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
Planen des Schreibens Ihrer gespeicherten Prozedur¶
Begrenzen Sie den Verbrauch von Arbeitsspeicher.
Snowflake belegt Methoden mit einer Begrenzung hinsichtlich der benötigten Menge an Arbeitsspeicher. Weitere Informationen dazu, wie Sie zu hohen Speicherverbrauch vermeiden können, finden Sie unter Entwerfen von Handlern unter Berücksichtigung der Snowflake-bedingten Einschränkungen.
Schreiben Sie thread-sicheren Code.
Stellen Sie sicher, dass Ihre Handler-Methode oder Funktion threadsicher ist.
Beachten Sie die Sicherheitseinschränkungen.
Da Ihr Handler-Code wird innerhalb einer eingeschränkten Engine ausgeführt wird, sollten Sie unbedingt die unter Sicherheitsverfahren für UDFs und Prozeduren beschriebenen Regeln befolgen.
Entscheiden Sie, ob Sie Eigentümerrechte oder Aufruferrechte nutzen möchten.
Entscheiden Sie bei der Planung Ihrer gespeicherten Prozedur, ob Sie die gespeicherte Prozedur mit Aufruferrechten oder Eigentümerrechten ausführen möchten.
Berücksichtigen Sie das Timeout-Verhalten von gespeicherten Prozeduren.
Die Ausführung einer gespeicherten Prozedur wird zeitlich begrenzt, es sei denn, der Timer wird durch die Aktivität des Codes zurückgesetzt. Insbesondere wird der Timeout-Timer durch die Interaktionen des Codes mit Daten zurückgesetzt, einschließlich Dateioperationen, Abfragen und Iterationen durch ein Resultset.
Schreiben der Klasse¶
Die Methode, die Sie definieren, muss Teil einer Klasse sein.
Beim Schreiben der Klasse ist Folgendes zu beachten:
Die Klasse und die Methode dürfen nicht geschützt oder privat sein.
Wenn die Methode nicht statisch ist und Sie einen Konstruktor definieren möchten, definieren Sie einen Null-Argument-Konstruktor für die Klasse. Snowflake ruft diesen Null-Argument-Konstruktor zur Initialisierungszeit auf, um eine Instanz Ihrer Klasse zu erstellen.
Sie können in derselben Klasse verschiedene Methoden für verschiedene gespeicherte Prozeduren definieren.
Schreiben der Methode¶
Beachten Sie beim Schreiben der Methode für die gespeicherte Prozedur Folgendes:
Geben Sie das Snowpark-
Session
-Objekt als erstes Argument Ihrer Methode an.Wenn Sie Ihre gespeicherte Prozedur aufrufen, erstellt Snowflake automatisch ein
Session
-Objekt und übergibt dieses an Ihre gespeicherte Prozedur. (Sie können dasSession
-Objekt nicht selbst erstellen.)Für die restlichen Argumente und den Rückgabewert werden die Java-Typen verwendet, die den Snowflake-Datentypen entsprechen.
Ihre Methode muss einen Wert zurückgeben. Für gespeicherte Prozeduren in Java ist ein Rückgabewert erforderlich.
Die Ausführung einer gespeicherten Prozedur wird zeitlich begrenzt, es sei denn, der Timer wird durch die Aktivität des Codes zurückgesetzt. Insbesondere wird der Timeout-Timer durch die Interaktionen des Codes mit Daten zurückgesetzt, einschließlich Dateioperationen, Abfragen und Iterationen durch ein Resultset.
Fehlerbehandlung¶
Sie können die üblichen Java-Techniken zur Ausnahmebehandlung verwenden, um Fehler innerhalb des Handler-Codes abzufangen.
Wenn innerhalb der Methode eine Ausnahme auftritt, die nicht von der Methode abgefangen wird, gibt Snowflake einen Fehler aus, der den Stacktrace für die Ausnahme enthält. Wenn die Protokollierung von unbehandelten Ausnahmen aktiviert ist, protokolliert Snowflake Daten zu unbehandelten Ausnahmen in einer Ereignistabelle.
Abhängigkeiten für Code zur Verfügung stellen¶
Wenn Ihr Handler-Code von Code abhängt, der außerhalb des Handlers selbst definiert ist (z. B. Klassen in einer JAR-Datei) oder von Ressourcendateien, können Sie diese Abhängigkeiten für Ihren Code zur Verfügung stellen, indem Sie ihn in einen Stagingbereich hochladen. Beim Erstellen der Prozedur können Sie diese Abhängigkeiten mithilfe der IMPORTS-Klausel referenzieren.
Weitere Informationen dazu finden Sie unter Abhängigkeiten für Code zur Verfügung stellen.
Zugriff auf Daten in Snowflake über Ihre gespeicherte Prozedur¶
Um auf Daten in Snowflake zuzugreifen, verwenden Sie die Snowpark-Bibliotheks-APIs.
Bei der Verarbeitung eines Aufrufs Ihrer gespeicherten Java-Prozedur erstellt Snowflake ein Snowpark-Session
-Objekt und übergibt das Objekt an die Methode für Ihre gespeicherte Prozedur.
Wie bei gespeicherten Prozeduren in anderen Sprachen wird der Kontext für die Sitzung (z. B. die Berechtigungen, die aktuelle Datenbank, das aktuelle Schema usw.) dadurch bestimmt, ob die gespeicherte Prozedur mit Aufruferrechten oder mit Eigentümerrechten ausgeführt wird. Weitere Details dazu finden Sie unter Accessing and Setting the Session State.
Sie können dieses Session
-Objekt verwenden, um APIs in der Snowpark-Bibliothek aufzurufen. Sie können zum Beispiel einen DataFrame für eine Tabelle erstellen oder eine SQL-Anweisung ausführen.
Weitere Informationen dazu finden Sie im Snowpark-Entwicklerhandbuch für Java.
Bemerkung
Weitere Informationen zu Einschränkungen, einschließlich Einschränkungen beim Zugriff auf Daten, finden Sie unter Einschränkungen.
Beispiel für Datenzugriff¶
Es folgt ein Beispiel für eine Java-Methode, die eine bestimmte Anzahl von Zeilen aus einer Tabelle in eine andere Tabelle kopiert. Der Methode werden die folgenden Argumente übergeben:
Ein Snowpark-
Session
-ObjektDer Name der Tabelle, aus der die Zeilen kopiert werden sollen
Der Name der Tabelle, in der die Zeilen gespeichert werden sollen
Die Anzahl der zu kopierenden Zeilen
Die Methode in diesem Beispiel gibt eine Zeichenfolge zurück.
import com.snowflake.snowpark_java.*;
public class MyClass
{
public String myMethod(Session session, String fromTable, String toTable, int count)
{
session.table(fromTable).limit(count).write().saveAsTable(toTable);
return "Success";
}
}
Lesen einer Datei mit einer Java-Prozedur¶
Sie können den Inhalt einer Datei mit Handler-Code lesen. Die Datei muss sich in einem Snowflake-Stagingbereich befinden, auf den Ihr Handler zugreifen kann. Sie könnten zum Beispiel eine Datei lesen, um unstrukturierte Daten im Handler zu verarbeiten.
Um den Inhalt von Stagingdateien zu lesen, kann Ihr Handler Methoden entweder der Klasse SnowflakeFile
oder der Klasse InputStream
aufrufen: Diese Vorgehensweise kann verwendet werden, wenn Sie während der Verarbeitung dynamisch auf die Datei zugreifen müssen. Weitere Informationen dazu finden Sie unter Lesen einer mit SnowflakeFile dynamisch spezifizierten Datei oder Lesen einer mit InputStream dynamisch spezifizierten Datei (unter diesem Thema).
SnowflakeFile
bietet Features, die bei InputStream
nicht verfügbar sind, wie in der folgenden Tabelle beschrieben.
Klasse |
Eingabe |
Anmerkungen |
---|---|---|
|
URL-Formate:
Die Datei muss sich in einem benannten internen Stagingbereich oder in einem externen Stagingbereich befinden. |
Einfacher Zugriff auf zusätzliche Dateiattribute, wie z. B. die Dateigröße. |
|
URL-Formate:
Die Datei muss sich in einem benannten internen Stagingbereich oder in einem externen Stagingbereich befinden. |
Lesen einer mit SnowflakeFile
dynamisch spezifizierten Datei¶
Im folgenden Codebeispiel nimmt eine Handler-Funktion execute
einen String
-Wert entgegen und gibt einen String
-Wert mit dem Inhalt der Datei zurück. Zur Laufzeit initialisiert Snowflake die Variable fileName
des Handlers anhand des eingehenden Dateipfads in der Variablen input
der Prozedur. Der Handler-Code verwendet eine SnowflakeFile
-Instanz, um die Datei zu lesen.
CREATE OR REPLACE PROCEDURE file_reader_java_proc_snowflakefile(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark_java.types.SnowflakeFile;
import com.snowflake.snowpark_java.Session;
class FileReader {
public String execute(Session session, String fileName) throws IOException {
InputStream input = SnowflakeFile.newInstance(fileName).getInputStream();
return new String(input.readAllBytes(), StandardCharsets.UTF_8);
}
}
$$;
Der Code im folgenden CALL-Beispiel erstellt eine Bereichs-URL, die auf die Datei verweist. Dies ist eine kodierte URL, die temporären Zugriff auf eine Stagingdatei erlaubt, ohne dass Berechtigungen für den Stagingbereich erteilt werden müssen.
CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Bemerkung
Bei einer gespeicherten Prozedur mit Eigentümerrechten muss der Eigentümer der Prozedur Zugriff auf alle Dateien haben, die keine Bereichs-URLs sind. Bei Prozeduren mit Aufruferrechten muss der Aufrufer Zugriff auf alle Dateien haben, die keine Bereichs-URLs sind. In beiden Fällen können Sie die Stagingdatei lesen, indem Ihr Handler-Code die Methode SnowflakeFile.newInstance
mit einem boolean
-Wert für einen neuen requireScopedUrl
-Parameter aufruft.
Das folgende Beispiel verwendet SnowflakeFile.newInstance
und gibt gleichzeitig an, dass keine Bereichs-URL erforderlich ist.
String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
Lesen einer mit InputStream
dynamisch spezifizierten Datei¶
Im folgenden Codebeispiel nimmt eine Handler-Funktion execute
einen InputStream
-Wert entgegen und gibt einen String
-Wert mit dem Inhalt der Datei zurück. Zur Laufzeit initialisiert Snowflake die Variable stream
des Handlers anhand des eingehenden Dateipfads im input
-Argument der Prozedur. Der Handler-Code verwendet den InputStream
, um die Datei zu lesen.
CREATE OR REPLACE PROCEDURE file_reader_java_proc_input(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark.Session;
class FileReader {
public String execute(Session session, InputStream stream) throws IOException {
String contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
return contents;
}
}
$$;
Der Code im folgenden CALL-Beispiel erstellt eine Bereichs-URL, die auf die Datei verweist. Dies ist eine kodierte URL, die temporären Zugriff auf eine Stagingdatei erlaubt, ohne dass Berechtigungen für den Stagingbereich erteilt werden müssen.
CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Zurückgeben von tabellarischen Daten¶
Sie können eine Prozedur schreiben, die Daten in tabellarischer Form zurückgibt. Gehen Sie wie folgt vor, um eine Prozedur zu schreiben, die Tabellendaten zurückgibt:
Geben Sie in der CREATE PROCEDURE-Anweisung
TABLE(...)
als Rückgabetyp der Prozedur an.Als TABLE-Parameter können Sie die Spaltennamen und Typen der zurückgegebenen Daten angeben, sofern Sie diese kennen. Wenn Sie beim Definieren der Prozedur die zurückgegebenen Spalten nicht kennen – z. B. wenn diese zur Laufzeit angegeben werden – können Sie die TABLE-Parameter weglassen. Wenn Sie dies tun, werden die Spalten des Rückgabewerts der Prozedur aus den Spalten des Datenframes konvertiert, der vom Handler zurückgegeben wird. Spaltendatentypen werden gemäß der unter Zuordnung von Datentypen zwischen SQL und Java angegebenen Zuordnung in SQL konvertiert.
Schreiben Sie den Handler so, dass er das tabellarische Ergebnis in einem Snowpark-DataFrame zurückgibt.
Weitere Informationen zu Datenframes finden Sie unter Verwenden von DataFrames in Snowpark Java.
Bemerkung
Eine Prozedur generiert zur Laufzeit einen Fehler, wenn eine der folgenden Bedingungen zutrifft:
TABLE ist als Rückgabetyp deklariert, aber sein Handler gibt keinen DataFrame zurück.
Der Handler gibt einen DataFrame zurück, aber die Prozedur deklariert TABLE nicht als Rückgabetyp.
Beispiel¶
Die Beispiele in diesem Abschnitt veranschaulichen die Rückgabe von Tabellenwerten aus einer Prozedur, die Zeilen herausfiltert, in denen eine Spalte mit einer Zeichenfolge übereinstimmt.
Definieren der Daten¶
Der Code im folgenden Beispiel erstellt eine Tabelle der Mitarbeiter.
CREATE OR REPLACE TABLE employees(id NUMBER, name VARCHAR, role VARCHAR);
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'op'), (2, 'Bob', 'dev'), (3, 'Cindy', 'dev');
Deklarieren einer Prozedur zum Filtern von Zeilen¶
Der Code in den folgenden beiden Beispielen erstellt eine gespeicherte Prozedur, die den Tabellennamen und die Rolle als Argumente verwendet und die Zeilen der Tabelle zurückgibt, deren Rollenspaltenwert mit der als Argument angegebenen Rolle übereinstimmt.
Angeben von Namen und Typen der Rückgabespalten¶
In diesem Beispiel werden Spaltennamen und -typen in der RETURNS TABLE()
-Anweisung angegeben.
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'Filter.filterByRole'
AS
$$
import com.snowflake.snowpark_java.*;
public class Filter {
public DataFrame filterByRole(Session session, String tableName, String role) {
DataFrame table = session.table(tableName);
DataFrame filteredRows = table.filter(Functions.col("role").equal_to(Functions.lit(role)));
return filteredRows;
}
}
$$;
Bemerkung
Derzeit können Sie in der RETURNS TABLE(...)
-Klausel den Datentyp GEOGRAPHY nicht als Spaltentyp angeben. Dies gilt unabhängig davon, ob Sie eine gespeicherte oder eine anonyme Prozedur erstellen.
CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
RETURNS TABLE(g GEOGRAPHY)
...
WITH test_return_geography_table_1() AS PROCEDURE
RETURNS TABLE(g GEOGRAPHY)
...
CALL test_return_geography_table_1();
Wenn Sie versuchen, GEOGRAPHY als Spaltentyp anzugeben, führt der Aufruf der gespeicherten Prozedur zu einem Fehler:
Stored procedure execution error: data type of returned table does not match expected returned table type
Um dieses Problem zu umgehen, können Sie die Spaltenargumente und -typen in RETURNS TABLE()
weglassen.
CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
RETURNS TABLE()
...
WITH test_return_geography_table_1() AS PROCEDURE
RETURNS TABLE()
...
CALL test_return_geography_table_1();
Weglassen von Namen und Typen der Rückgabespalten¶
Der Code im folgenden Beispiel deklariert eine Prozedur, mit der Spaltennamen und -typen des Rückgabewerts aus den im Rückgabewert des Handlers enthaltenen Spalten extrapoliert werden können. Die Spaltennamen und -typen aus der RETURNS TABLE()
-Anweisung werden weggelassen.
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'FilterClass.filterByRole'
AS
$$
import com.snowflake.snowpark_java.*;
public class FilterClass {
public DataFrame filterByRole(Session session, String tableName, String role) {
DataFrame table = session.table(tableName);
DataFrame filteredRows = table.filter(Functions.col("role").equal_to(Functions.lit(role)));
return filteredRows;
}
}
$$;
Aufrufen der Prozedur¶
Im folgenden Beispiel wird die gespeicherte Prozedur aufgerufen:
CALL filter_by_role('employees', 'dev');
Der Prozeduraufruf erzeugt die folgende Ausgabe:
+----+-------+------+
| ID | NAME | ROLE |
+----+-------+------+
| 2 | Bob | dev |
| 3 | Cindy | dev |
+----+-------+------+
Vorbereiten einer in einem Stagingbereich gespeicherten Prozedur¶
Wenn Sie vorhaben, eine gespeicherte Prozedur zu erstellen, deren Handler kompiliert und in einen Stagingbereich kopiert wird (anstatt als Quelle inline aufbewahrt zu werden), müssen Sie Ihre Klassen in eine JAR-Datei kompilieren und verpacken, und Sie müssen die JAR-Datei in den Stagingbereich hochladen.
Handler-Code kompilieren und packen
Um das Einrichten Ihrer gespeicherten Prozedur zu vereinfachen, erstellen Sie eine JAR-Datei, die alle für Ihre gespeicherte Prozedur benötigten Abhängigkeiten enthält. Später müssen Sie die JAR-Datei in einen Stagingbereich hochladen und in Ihrer CREATE PROCEDURE-Anweisung auf die JAR-Datei verweisen. Dieser Vorgang ist einfacher, wenn Sie weniger JAR-Dateien hochladen und auf sie verweisen müssen.
Verwenden von Maven zum Erstellen einer JAR-Datei mit Abhängigkeiten.
Wenn Sie Maven zum Erstellen und Packen Ihres Codes verwenden, können Sie das Maven Assembly Plugin verwenden, um eine JAR-Datei zu erstellen, die alle Abhängigkeiten enthält. Weitere Informationen dazu finden Sie unter Packen von Java- oder Scala-Handler-Code mit Maven.
Verwenden anderer Tools zum Erstellen einer JAR-Datei mit Abhängigkeiten.
Wenn Sie Maven nicht verwenden, finden Sie in der Dokumentation Ihres Erstellungstools eine Anleitung zum Erstellen einer JAR-Datei mit allen Abhängigkeiten.
Wenn Sie beispielsweise ein IntelliJ IDEA-Projekt verwenden, finden Sie die erforderlichen Informationen in der Anleitung zum Einrichten einer Artefakt-Konfiguration.
Dateien in einen Stagingbereich hochladen
Um die Logik Ihrer Prozedur (und ggf. andere Abhängigkeiten) für die Prozedur zur Verfügung zu stellen, müssen Sie die erforderlichen Dateien in einen Stagingbereich hochladen. Weitere Informationen dazu finden Sie unter Abhängigkeiten für Code zur Verfügung stellen.