2010-11-10 6 views
7

Come identificare se un codice (un servlet o una classe semplice) è in esecuzione in runtime di Google App Engine (Java) in modo che sia possibile decidere se utilizzare le librerie specifiche del motore dell'app o no? Esiste un ID ambiente runtime affidabile per questo?identifica se il codice è in esecuzione su runtime del motore dell'app (Java)

+0

Eventuali duplicati di [Come controllare in Java App Engine se siamo sulla workstation di sviluppo] (http://stackoverflow.com/ domande/1574637/how-to-check-in-java-app-engine-if-we-are-on-development-workstation) –

risposta

4

È possibile controllare la proprietà com.google.appengine.runtime.version:

String appEngineVersion = System.getProperty("com.google.appengine.runtime.version"); 

Se è impostato, è App Engine.

Ma vorrei prendere in considerazione l'utilizzo di obiettivi di compilazione separati, al fine di evitare il sovraccarico di runtime.

+1

Grazie mille per la risposta. Ho 2 sottoclassi di implementazione separate per i 2 casi e sono abbastanza piccole (200 righe in dimensioni di codice in totale di entrambi) per avere bisogno di build separate, suppongo. – nsegae

1

Come ha detto il signor Flaschen, ci sono proprietà di sistema che è possibile verificare per determinare se GAE è presente o meno. This link fornisce i dettagli.

Se si segue questa rotta, è necessario creare l'applicazione in modo che il codice principale non abbia dipendenze statiche dalle classi GAE; Niente importazioni o altri riferimenti a pacchetti e classi GAE nel codice (a parte nomi di classi GAE, ecc. in string letterali). Tutte le dipendenze devono essere isolate per il codice che viene caricato utilizzando Class.forName(String) DOPO aver determinato se GAE è presente o meno.

Questo rappresenta un sovraccarico non banale:

  • Probabilmente finire con un'interfaccia adattatore supplementare e (almeno) due implementazioni per i casi GAE e non GAE.
  • Si dispone dei (minori) sovraccarichi di runtime per caricare dinamicamente la classe rilevante all'avvio e per chiamare attraverso l'interfaccia Adapter.
  • Il tuo file JAR è molto più grande di conseguenza.
  • Ora è necessario testare su due piattaforme.

D'altra parte, si ha il potenziale vantaggio di avere un JAR che funziona sia in GAE e contesti non GAE.

0

C'è anche un altro modo per farlo. Questo è spiegato bene nella documentazione del gaevfs su come scrivere codice portabile: http://code.google.com/p/gaevfs/wiki/ApplicationPortability

Di interesse per voi è la seguente riga:

boolean isGoogleAppEngine = getServletContext().getServerInfo().contains("Google"); 
1

Come spiegato here è possibile controllare la seguente proprietà:

String environment = System.getProperty(
    "com.google.appengine.runtime.environment") 

environment è "Produzione" quando è in esecuzione su App Engine e "Sviluppo" quando è in esecuzione nel server di sviluppo.

2

simile a quello che ha scritto @Reza, ma un po 'più pulito:

uso SystemProperty.environment.value() per ottenere "Produzione" durante l'esecuzione su App Engine, e "Sviluppo " durante l'esecuzione nel server di sviluppo.

1

ho visto nessuna soluzione type-safe qui ecco che è:

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) { 
    // The app is running on App Engine... 
} 
Problemi correlati