Accedere ai servizi in bundle legacy per Java 11 e versioni successive

Questa pagina descrive come installare e utilizzare i servizi in bundle con l'ultima versione di Java supportata per l'ambiente standard di App Engine. La tua app può accedere ai servizi in bundle tramite il file JAR dell'API App Engine.

Prima di iniziare

Installa il file JAR dell'API App Engine

Per utilizzare i servizi in bundle legacy nella tua app Java più recente supportata, devi utilizzare un file appengine-web.xml per configurare l'app (anziché un file app.yaml).

L'esempio seguente mostra come aggiungere le impostazioni di configurazione nel file appengine-web.xml per diverse versioni di Java. Per utilizzare l'ultima versione supportata nella configurazione predefinita, devi aggiornare i servlet dell'applicazione e le dipendenze in modo da includere lo spazio dei nomi Jakarta. Per saperne di più sulle opzioni di configurazione, consulta Eseguire l'upgrade di un'applicazione esistente.

Aggiungi le seguenti impostazioni al file appengine-web.xml a seconda della versione di Java:

Java 25 (anteprima, EE 11)

  <?xml version="1.0" encoding="utf-8"?>
  <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java25</runtime>
      <system-properties>
        <property name="appengine.use.EE11" value="true"/>
      </system-properties>
      <app-engine-apis>true</app-engine-apis>
  </appengine-web-app>

Java 21 (EE 10)

  <?xml version="1.0" encoding="utf-8"?>
  <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java21</runtime>
      <system-properties>
        <property name="appengine.use.EE10" value="true"/>
      </system-properties>
      <app-engine-apis>true</app-engine-apis>
  </appengine-web-app>

Java 17 (EE 8)

  <?xml version="1.0" encoding="utf-8"?>
  <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java17</runtime>
      <system-properties>
        <property name="appengine.use.EE8" value="true"/>
      </system-properties>
      <app-engine-apis>true</app-engine-apis>
  </appengine-web-app>

Per specificare i servizi in bundle legacy come dipendenza, aggiungi le seguenti righe nel file pom.xml:

 <dependency>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-api-1.0-sdk</artifactId>
    <version>2.0.31</version> <!-- or later-->
  </dependency>

Se la tua app utilizza un file web.xml, devi aggiungere l'elemento <app-engine-apis> e impostarlo su true:

  <app-engine-apis>true</app-engine-apis>

Per eseguire il deployment dell'app Java 25 (anteprima), esegui il comando mvn appengine:deploy o il comando gcloud app deploy ~/my_app/WEB-INF/appengine-web.xml su un'applicazione web compilata e sottoposta a staging.

Punto di ingresso predefinito per Java 25 (anteprima)

Le applicazioni Java 25 (anteprima) beneficiano di una configurazione utente aggiuntiva all'avvio della JVM per le applicazioni web.

Il punto di ingresso predefinito utilizzato per avviare la JVM viene generato dai buildpack di App Engine. In sostanza, è equivalente a definire questo punto di ingresso nel file appengine-web.xml. Ad esempio:

java --add-opens java.base/java.lang=ALL-UNNAMED  --add-opens java.base/java.nio.charset=ALL-UNNAMED -showversion -Xms32M -Xmx204M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+PrintCommandLineFlags -Dclasspath.runtimebase=/base/java_runtime -Djava.class.path=/base/java_runtime/runtime-main.jar -Djava.library.path=/base/java_runtime: com/google/apphosting/runtime/JavaRuntimeMainWithDefaults --fixed_application_path=/workspace /base/java_runtime

Non è consigliabile modificare questo punto di ingresso predefinito, in quanto le impostazioni di memoria vengono calcolate in base al tipo di istanza (F1, F2, F4) e alla memoria disponibile.

Per impostazione predefinita, utilizziamo --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED per aprire alcune API JDK necessarie.

Funzionalità del punto di ingresso

Il punto di ingresso per le versioni Java di seconda generazione può essere personalizzato con variabili di ambiente definite dall'utente aggiunte nel file di configurazione appengine-web.xml.

La tabella seguente indica le variabili di ambiente che possono essere utilizzate per attivare/disattivare/configurare le funzionalità e i valori predefiniti se non sono impostati:

Env Var Descrizione Tipo Predefinito
CPROF_ENABLE Stackdriver Profiler boolean false
GAE_MEMORY_MB Memoria disponibile dimensioni Impostato da App Engine o /proc/meminfo-400M
HEAP_SIZE_RATIO Memoria per l'heap percentuale 80
HEAP_SIZE_MB Heap disponibile dimensioni ${HEAP_SIZE_RATIO}% di ${GAE_MEMORY_MB}
JAVA_HEAP_OPTS Argomenti heap JVM Argomenti JVM -Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M
JAVA_GC_OPTS JVM GC args Argomenti JVM -XX:+UseG1GC plus configuration
JAVA_USER_OPTS Altri argomenti JVM Argomenti JVM
JAVA_OPTS Argomenti JVM Argomenti JVM Vedi di seguito

Se non impostato esplicitamente, JAVA_OPTS viene impostato su:

   JAVA_OPTS:=-showversion \
              $JAVA_HEAP_OPTS \
              $JAVA_GC_OPTS \
              $JAVA_USER_OPTS

Quando CPROF_ENABLE è true, il punto di ingresso predefinito aggiunge PROFILER_AGENT come:

-agentpath:/opt/cprof/profiler_java_agent.so=--logtostderr

Ad esempio, se il codice dell'applicazione richiede più flag -add-opens, puoi utilizzare la variabile di ambiente JAVA_USER_OPTS definita nel file appengine-web.xml:

    <env-variables>
       <env-var name="JAVA_USER_OPTS" value="--add-opens java.base/java.util=ALL-UNNAMED" />
     </env-variables>

Considerazioni sulla migrazione

Se esegui la migrazione a un runtime Java di seconda generazione e la tua app utilizza servizi in bundle legacy, tieni presente le seguenti considerazioni:

  • Per testare le funzionalità dei servizi in bundle legacy nella tua app Java di seconda generazione, puoi utilizzare il server di sviluppo locale.
  • A differenza del runtime Java 8, i runtime Java di seconda generazione includono la JVM come parte della memoria dell'istanza. Se nei log vengono visualizzati errori relativi alla memoria, valuta la possibilità di aumentare le dimensioni della classe di istanza nel file appengine-web.xml.
  • Se la tua applicazione tenta di chiamare un'API non abilitata per i runtime Java di seconda generazione, riceverà un errore com.google.apphosting.api.ApiProxy$FeatureNotEnabledException.
  • Si presume che tutte le applicazioni siano thread-safe nei runtime Java di seconda generazione. Devi rimuovere l'elemento threadsafe nel file app.yaml o appengine-web.xml quando esegui la migrazione da Java 8 all'ultima versione di runtime Java.

Esempio (Datastore)

Per un esempio di come utilizzare Firestore in modalità Datastore (Datastore), consulta l'esempio di codice dei servizi in bundle legacy per Java 11 su GitHub.