

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Distribuisci funzioni Lambda per Java con archivi di file .zip o JAR
<a name="java-package"></a>

Il codice della AWS Lambda funzione è costituito da script o programmi compilati e dalle relative dipendenze. Utilizza un *pacchetto di implementazione* per distribuire il codice della funzione a Lambda. Lambda supporta due tipi di pacchetti di implementazione: immagini di container e archivi di file .zip. 

Questa pagina descrive come creare il pacchetto di distribuzione come file.zip o file Jar, quindi utilizzare il pacchetto di distribuzione per distribuire il codice della funzione su (). AWS Lambda AWS Command Line Interface AWS CLI

**Importante**  
Java 25 ha introdotto il supporto per le cache Ahead-of-Time (AOT). Ti consigliamo vivamente di non utilizzare le cache AOT quando distribuisci le tue funzioni come archivi di file.zip o JAR, poiché le cache possono causare un comportamento imprevisto quando Lambda aggiorna il runtime gestito. Per ulteriori informazioni, vedere. [Ahead-of-Time (AOT) e cache CDS](java-customization.md#aot-cds-caches)

**Topics**
+ [

## Prerequisiti
](#java-package-prereqs)
+ [

## Strumenti e librerie
](#java-package-libraries)
+ [

## Creazione di un pacchetto di distribuzione con Gradle
](#java-package-gradle)
+ [

## Utilizzo dei livelli per le dipendenze
](#java-package-layers)
+ [

## Creazione di un pacchetto di distribuzione con Maven
](#java-package-maven)
+ [

## Caricamento di un pacchetto di implementazione con la console Lambda
](#java-package-console)
+ [

## Caricamento di un pacchetto di distribuzione con AWS CLI
](#java-package-cli)
+ [

## Caricamento di un pacchetto di distribuzione con AWS SAM
](#java-package-cloudformation)

## Prerequisiti
<a name="java-package-prereqs"></a>

 AWS CLI È uno strumento open source che consente di interagire con i AWS servizi utilizzando i comandi nella shell della riga di comando. Per completare le fasi riportate in questa sezione, è necessario disporre della [AWS CLI versione 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

## Strumenti e librerie
<a name="java-package-libraries"></a>

AWS fornisce le seguenti librerie per le funzioni Java. Queste librerie sono disponibili tramite [Maven Central Repository](https://search.maven.org/search?q=g:com.amazonaws).
+ [com.amazonaws: aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-core) (obbligatorio) — Definisce le interfacce del metodo del gestore e l'oggetto di contesto che il runtime passa al gestore. Se definisci i propri tipi di input, questa è l'unica libreria necessaria.
+ [com.amazonaws: aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-events) — Tipi di input per eventi provenienti da servizi che richiamano funzioni Lambda.
+ [com.amazonaws: aws-lambda-java-log 4j2 — Una libreria di appender per Apache Log4j 2](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-log4j2) [che puoi utilizzare per aggiungere l'ID della richiesta per la chiamata corrente ai log delle funzioni.](java-logging.md)
+ [AWS SDK for Java](https://github.com/aws/aws-sdk-java-v2) 2.0 — L'SDK AWS ufficiale per il linguaggio di programmazione Java.

Aggiungi queste librerie alla definizione di build come segue.

------
#### [ Gradle ]

```
dependencies {
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.2'
    implementation 'com.amazonaws:aws-lambda-java-events:3.11.1'
    runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
}
```

------
#### [ Maven ]

```
  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.2</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-events</artifactId>
      <version>3.11.1</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-log4j2</artifactId>
      <version>1.5.1</version>
    </dependency>
  </dependencies>
```

------

Per creare un pacchetto di distribuzione, compila il codice della funzione e le dipendenze in un singolo file .zip o un file di archivio Java (JAR). Per Gradle, [utilizza il tipo di build `Zip`](#java-package-gradle). Per Apache Maven, [utilizza il plugin Maven Shade](#java-package-maven). Per caricare il pacchetto di distribuzione, usa la console Lambda, l'API Lambda o (). AWS Serverless Application Model AWS SAM

**Nota**  
Per mantenere contenute le dimensioni del pacchetto di distribuzione, raggruppa le dipendenze della funzione in livelli. I livelli consentono di gestire le dipendenze in modo indipendente, possono essere utilizzate da più funzioni e possono essere condivisi con altri account. Per ulteriori informazioni, consulta [Gestione delle dipendenze Lambda con i livelli](chapter-layers.md).

## Creazione di un pacchetto di distribuzione con Gradle
<a name="java-package-gradle"></a>

Per creare un pacchetto di implementazione con il codice e le dipendenze della funzione in Gradle, utilizza il tipo di compilazione `Zip`. Ecco un esempio tratto da un [file build.gradle di esempio completo](https://github.com/awsdocs/aws-lambda-developer-guide/blob/main/sample-apps/s3-java/build.gradle):

**Example build.gradle: attività di compilazione**  

```
task buildZip(type: Zip) {
    into('lib') {
        from(jar)
        from(configurations.runtimeClasspath)
    }
}
```

Questa configurazione di build crea un pacchetto di distribuzione nella directory `build/distributions`. All'interno dell'istruzione `into('lib')`, l'attività `jar` assembla un archivio jar contenente le classi principali in una cartella denominata `lib`. Inoltre, l'istruzione `configurations.runtimeClassPath` copia le librerie delle dipendenze dal classpath della build in una cartella denominata `lib`.

**Example build.gradle: dipendenze**  

```
dependencies {
    ...
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.2'
    implementation 'com.amazonaws:aws-lambda-java-events:3.11.1'
    implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
    implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
    runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.1'
    runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
    ...
}
```

Lambda carica i file JAR in ordine alfabetico Unicode. Se più file JAR nella directory `lib` contengono la stessa classe, viene utilizzato il primo. È possibile utilizzare il seguente script di shell per identificare le classi duplicate:

**Example test-zip.sh**  

```
mkdir -p expanded
unzip path/to/my/function.zip -d expanded
find ./expanded/lib -name '*.jar' | xargs -n1 zipinfo -1 | grep '.*.class' | sort | uniq -c | sort
```

## Utilizzo dei livelli per le dipendenze
<a name="java-package-layers"></a>

È possibile impacchettare le dipendenze della funzione in livelli per mantenere piccolo il pacchetto di distribuzione e gestire le dipendenze in modo indipendente. Per ulteriori informazioni, consulta [Utilizzo dei livelli per le funzioni Lambda in Java](java-layers.md).

## Creazione di un pacchetto di distribuzione con Maven
<a name="java-package-maven"></a>

Per creare un pacchetto di distribuzione con Maven, utilizzare il [plugin Maven Shade](https://maven.apache.org/plugins/maven-shade-plugin/). Il plugin crea un file JAR che contiene il codice della funzione compilato e tutte le relative dipendenze.

**Example pom.xml: configurazione del plugin**  

```
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
```

Per compilare il pacchetto di distribuzione, utilizzare il comando `mvn package`.

```
[INFO] Scanning for projects...
[INFO] -----------------------< com.example:java-maven >-----------------------
[INFO] Building java-maven-function 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-maven ---
[INFO] Building jar: target/java-maven-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:3.2.2:shade (default) @ java-maven ---
[INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.2.2 in the shaded jar.
[INFO] Including com.amazonaws:aws-lambda-java-events:jar:3.11.1 in the shaded jar.
[INFO] Including joda-time:joda-time:jar:2.6 in the shaded jar.
[INFO] Including com.google.code.gson:gson:jar:2.8.6 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing target/java-maven-1.0-SNAPSHOT.jar with target/java-maven-1.0-SNAPSHOT-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.321 s
[INFO] Finished at: 2020-03-03T09:07:19Z
[INFO] ------------------------------------------------------------------------
```

Questo comando genera un file JAR nella directory `target`.

**Nota**  
Se stai lavorando con un [JAR multi-rilascio (MRJAR)](https://openjdk.org/jeps/238), devi includere l'MRJAR (ossia il JAR shaded prodotto dal plug-in Maven Shade) nella directory `lib` e comprimerlo prima di caricare il pacchetto di implementazione in Lambda. In caso contrario, Lambda potrebbe non decomprimere correttamente il file JAR, facendo sì che il file `MANIFEST.MF` venga ignorato.

Se si utilizza la libreria appender (`aws-lambda-java-log4j2`), è necessario configurare anche un trasformatore per il plugin Maven Shade. La libreria del trasformatore combina le versioni di un file di cache presenti sia nella libreria appender che in Log4j.

**Example pom.xml: configurazione del plugin con l'appender Log4j 2**  

```
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer">
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>com.github.edwgiz</groupId>
            <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
            <version>2.13.0</version>
          </dependency>
        </dependencies>
      </plugin>
```

## Caricamento di un pacchetto di implementazione con la console Lambda
<a name="java-package-console"></a>

 Per creare una nuova funzione, devi prima creare la funzione nella console, quindi devi caricare il tuo file .zip o JAR. Per aggiornare una funzione esistente, apri la pagina relativa alla tua funzione, quindi segui la stessa procedura per aggiungere il file .zip o JAR aggiornato. 

 Se il file del pacchetto di implementazione ha dimensioni inferiori a 50 MB, è possibile creare o aggiornare una funzione caricando il file direttamente dal computer locale. Per i file .zip o JAR di dimensioni superiori a 50 MB, prima è necessario caricare il pacchetto in un bucket Amazon S3. Per istruzioni su come caricare un file in un bucket Amazon S3 utilizzando il Console di gestione AWS, consulta la [Guida introduttiva ad Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html). *Per caricare file utilizzando la AWS CLI, consulta [Move objects](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) nella Guida per l'AWS CLI utente.* 

**Nota**  
Non è possibile modificare il [tipo di pacchetto di implementazione](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip o immagine di container) per una funzione esistente. Ad esempio, non è possibile convertire una funzione di immagine di container esistente per utilizzare un archivio di file .zip. È necessario creare una nuova funzione.

**Creazione di una nuova funzione (console)**

1. Apri la [pagina Funzioni](https://console.aws.amazon.com/lambda/home#/functions) della console Lambda e scegli **Crea funzione**.

1. Scegli **Author from scratch** (Crea da zero).

1. In **Basic information (Informazioni di base)** eseguire queste operazioni:

   1. In **Nome funzione**, inserisci il nome della funzione.

   1. Per **Runtime**, seleziona il runtime che desideri utilizzare.

   1. (Facoltativo) Per **Architettura**, scegli l'architettura del set di istruzioni per la funzione. L'architettura predefinita è x86\$164. Assicurati che il pacchetto di implementazione per la tua funzione sia compatibile con l'architettura del set di istruzioni scelta.

1. (Opzionale) In **Autorizzazioni** espandere **Modifica ruolo di esecuzione predefinito**. Puoi creare un nuovo **ruolo di esecuzione** o utilizzare un ruolo esistente.

1. Scegli **Crea funzione**. Lambda crea una funzione di base "Hello world" utilizzando il runtime scelto.

**Caricamento di un archivio .zip o JAR dal computer locale (console)**

1. Nella [pagina Funzioni](https://console.aws.amazon.com/lambda/home#/functions) della console Lambda, scegli la funzione per cui vuoi caricare il file .zip o JAR.

1. Scegli la scheda **Codice**.

1. Nel riquadro **Origine del codice**, scegli **Carica da**.

1. Scegli **File .zip o .jar**.

1. Per caricare il file .zip o JAR, procedi come segue:

   1. Seleziona **Carica**, quindi seleziona il tuo file .zip o JAR nel selettore di file.

   1. Seleziona **Apri**.

   1. Scegli **Save** (Salva).

**Caricamento di un archivio .zip o JAR da un bucket Amazon S3 (console)**

1. Nella [pagina Funzioni](https://console.aws.amazon.com/lambda/home#/functions) della console Lambda, scegli la funzione per cui vuoi caricare un nuovo file .zip o JAR.

1. Scegli la scheda **Codice**.

1. Nel riquadro **Origine del codice**, scegli **Carica da**.

1. Scegli **Posizione Amazon S3**.

1. Incolla l'URL del link Amazon S3 del tuo file .zip e scegli **Salva**.

## Caricamento di un pacchetto di distribuzione con AWS CLI
<a name="java-package-cli"></a>

 È possibile utilizzare la [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) per creare una nuova funzione o aggiornare una funzione esistente mediante un file .zip o JAR. Usa la funzione [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) e [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html)i comandi per distribuire il tuo pacchetto.zip o JAR. Se il file ha dimensioni inferiori a 50 MB, è possibile caricare il pacchetto da una posizione nella macchina di compilazione locale. Per i file di dimensioni superiori, è necessario caricare il pacchetto .zip o JAR da un bucket Amazon S3. *Per istruzioni su come caricare un file su un bucket Amazon S3 utilizzando AWS CLI, consulta [Move objects](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) nella User Guide.AWS CLI * 

**Nota**  
Se carichi il tuo file.zip o JAR da un bucket Amazon S3 utilizzando AWS CLI il, il bucket deve trovarsi nella stessa posizione della Regione AWS tua funzione.

 Per creare una nuova funzione utilizzando un file.zip o JAR con AWS CLI, devi specificare quanto segue: 
+ Il nome della funzione (`--function-name`)
+ Il runtime della tua funzione (`--runtime`)
+ Il nome della risorsa Amazon (ARN) del [ruolo di esecuzione](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) della funzione (`--role`)
+ Il nome del metodo del gestore nel codice della funzione (`--handler`)

 È inoltre necessario specificare la posizione del file .zip o JAR. Se il file .zip o JAR si trova in una cartella nella macchina di compilazione locale, utilizza l'opzione `--zip-file` per specificare il percorso del file, come mostrato nel seguente comando di esempio. 

```
aws lambda create-function --function-name myFunction \
--runtime java25 --handler example.handler \
--role arn:aws:iam::123456789012:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 Per specificare la posizione del file .zip in un bucket Amazon S3, utilizza l'opzione `--code` illustrata nel seguente comando di esempio. È necessario utilizzare il parametro `S3ObjectVersion` solo per gli oggetti con controllo delle versioni. 

```
aws lambda create-function --function-name myFunction \
--runtime java25 --handler example.handler \
--role arn:aws:iam::123456789012:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 Per aggiornare una funzione esistente mediante la CLI, specifica il nome della funzione utilizzando il parametro `--function-name`. È inoltre necessario specificare la posizione del file .zip che desideri utilizzare per aggiornare il codice della funzione. Se il file .zip si trova in una cartella sulla macchina di compilazione locale, utilizza l'opzione `--zip-file` per specificare il percorso del file, come mostrato nel seguente comando di esempio. 

```
aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip
```

 Per specificare la posizione del file .zip in un bucket Amazon S3, utilizza le opzioni `--s3-bucket` e `--s3-key` come illustrato nel seguente comando di esempio. È necessario utilizzare il parametro `--s3-object-version` solo per gli oggetti con controllo delle versioni. 

```
aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
```

## Caricamento di un pacchetto di distribuzione con AWS SAM
<a name="java-package-cloudformation"></a>

È possibile utilizzarlo AWS SAM per automatizzare le distribuzioni del codice funzionale, della configurazione e delle dipendenze. AWS SAM è un'estensione CloudFormation che fornisce una sintassi semplificata per la definizione di applicazioni serverless. Il modello di esempio seguente definisce una funzione con un pacchetto di distribuzione nella directory `build/distributions` utilizzata da Gradle:

**Example template.yml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Lambda application that calls the Lambda API.
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      CodeUri: build/distributions/java-basic.zip
      Handler: example.Handler
      Runtime: java25
      Description: Java function
      MemorySize: 512
      Timeout: 10
      # Function's execution role
      Policies:
        - AWSLambdaBasicExecutionRole
        - AWSLambda_ReadOnlyAccess
        - AWSXrayWriteOnlyAccess
        - AWSLambdaVPCAccessExecutionRole
      Tracing: Active
```

Per creare la funzione, utilizzare i comandi `package` e `deploy`. Questi comandi sono personalizzazioni per l' AWS CLI. Essi avvolgono altri comandi per caricare il pacchetto di distribuzione Amazon S3, riscrivere il modello con l'URI dell'oggetto e aggiornare il codice della funzione.

Lo script di esempio seguente esegue una compilazione Gradle e carica il pacchetto di distribuzione creato. Crea uno CloudFormation stack la prima volta che lo esegui. Se lo stack esiste già, lo script lo aggiorna.

**Example deploy.sh**  

```
#!/bin/bash
set -eo pipefail
aws cloudformation package --template-file template.yml --s3-bucket MY_BUCKET --output-template-file out.yml
aws cloudformation deploy --template-file out.yml --stack-name java-basic --capabilities CAPABILITY_NAMED_IAM
```

Per un esempio pratico completo, consulta le seguenti applicazioni di esempio:

**Applicazioni Lambda di esempio in Java**
+ [example-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/example-java): una funzione Java che dimostra come utilizzare Lambda per elaborare gli ordini. Questa funzione illustra come definire e deserializzare un oggetto evento di input personalizzato, utilizzare l' AWS SDK e registrare l'output.
+ [java-basic](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-basic): una raccolta di funzioni Java minimali con unit test e configurazione della registrazione dei log delle variabili.
+ [java-events](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events): una raccolta di funzioni Java che contengono codice skeleton per la gestione degli eventi di vari servizi, ad esempio Gateway Amazon API, Amazon SQS e Amazon Kinesis. Queste funzioni utilizzano la versione più recente della [aws-lambda-java-events](#java-package)libreria (3.0.0 e successive). Questi esempi non richiedono l' AWS SDK come dipendenza.
+ [s3-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/s3-java) – Una funzione Java che elabora gli eventi di notifica da Amazon S3 e utilizza la Java Class Library (JCL) per creare anteprime dai file di immagine caricati.
+ [layer-java](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-java): una funzione Java che illustra come utilizzare un livello Lambda per impacchettare dipendenze separate dal codice della funzione principale.