2016-07-10 6 views
0

Ich versuche eine Konfiguration in meiner Entwicklungsumgebung zu erstellen, um DATABASE_URL zu laden, die auch mit Herokus DATABASE_URL auf Heroku funktioniert. Unglücklicherweise scheinen keine der Techniken, die ich versuche, lokale Umgebungsvariablen zu erstellen, in meiner Gradle/Boot/IntelliJ-Umgebung zu funktionieren. Hier ist, was ich versucht:Wie richte ich eine Java-Umgebungsvariable in einer Spring Boot/Gradle/IntelliJ-Umgebung ein?

  1. ein Hinzufügen von export DATABASE_URL=jdbc:postgresql...-/etc/environment
  2. Hinzufügen -DDATABASEURL=jdbc:postgresql... meiner gradle Aufgabe VM-Optionen (mit bootRun.systemProperties = System.properties)
  3. Meine behelfen Antwort unten, dass ich wirklich mag nicht.

Antwort

0

ich meine eigene Frage mit der besten Antwort zu beantworten Ich habe, aber wirklich der Hoffnung auf eine bessere zu akzeptieren!

Ich habe eine andere Eigenschaftendatei für jede meiner Umgebungen. In development.properties fügte ich

localDatabaseUrl=postgres://postgres:[email protected]:5432/Nitro 

Und wenn ich keine DATABASE_URL Umgebungsvariable gefunden haben, dann lese ich nur, dass man aus den Eigenschaften-Datei:

@Configuration 
public class DatabaseConfig { 

    @Value("${localDatabaseUrl}") 
    String localDatabaseUrl; 

    private static final Logger log = LoggerFactory.getLogger(DatabaseConfig.class); 

    @Bean 
    public BasicDataSource dataSource() throws URISyntaxException { 

     URI dbUri; 
     try { 
      dbUri = new URI(System.getenv("DATABASE_URL")); 
      log.info("Connecting via DATABASE_URL environment variable"); 
     } catch (NullPointerException ex) { 
      dbUri = new URI(localDatabaseUrl); 
      log.info("Connecting via localDatabaseUrl properties key/value ***"); 
     } 

     String username = dbUri.getUserInfo().split(":")[0]; 
     String password = dbUri.getUserInfo().split(":")[1]; 
     String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath(); 

     BasicDataSource basicDataSource = new BasicDataSource(); 
     basicDataSource.setUrl(dbUrl); 
     basicDataSource.setUsername(username); 
     basicDataSource.setPassword(password); 

     return basicDataSource; 
    } 

} 
0

First off, können Sie es vorziehen, mit JDBC_DATABASE_URL wie in Heroku DevCenter beschrieben.

Das heißt, entweder Variable ist in Ordnung. Ich denke auch, Fallback-Logik ist auch in Ordnung. Aber ich würde wahrscheinlich gefällt es das:

if (null == System.getenv("JDBC_DATABASE_URL")) { 
    dbUri = new URI(System.getenv("JDBC_DATABASE_URL")); 
} else { 
    dbUri = new URI(localDatabaseUrl); 
} 

Ein weiterer Ansatz ist es, eine .env-Datei und die heroku local Befehl zu verwenden. Ihre .env Datei enthalten würde:

JDBC_DATABASE_URL=postgres://... 

Der heroku local Befehl wird der Befehl in Ihrer Procfile verwenden Ihre Anwendung auszuführen. Aber das hilft nicht bei der Verwendung von ./gradlew bootRun und anderen solchen Aufgaben.

+0

Dank @codefinger. Ich weiß, dass es noch eine bessere Möglichkeit gibt, eine Umgebungsvariable zu erstellen, die Java auf Ubuntu lesen kann. Ich warte nur darauf. – Spider

0

Zum einen kann Frühling Umgebungsvariablen lösen automatisch und zum anderen werden Variablen lösen nach der Reihenfolge hier definiert (die eine Feder-Boot-doc Seite ist jedoch das gleiche gilt für nicht-Boot-Projekte halten sollte):

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Einstellen der Variablen als environemt in Heroku vars wird dann die Version in den Eigenschaften außer Kraft setzen Datei ohne weitere Codierung erforderlich:

//these properties will be resolved automatically from Heroku env vars if present 
    //otherwise will be resolved from properties file bundled in the WAR 
    @Value("${database.url}") 
    String databaseUrl; 

    @Value("${database.user}") 
    String databaseUser; 

    @Value("${database.password}") 
    String databasePassword; 

    @Bean 
    public BasicDataSource dataSource() throws URISyntaxException { 

     BasicDataSource basicDataSource = new BasicDataSource(); 
     basicDataSource.setUrl(databaseUrl); 
     basicDataSource.setUsername(databaseUser); 
     basicDataSource.setPassword(databasePassword); 

     return basicDataSource; 
    } 
} 

Fügen Sie den vars von Ihrem lokale Eigenschaften Datei, die Sie Ihre App Heroku Einstellungen durch einige Mittel außer Kraft setzen wollen:

enter image description here

Verwandte Themen