2012-09-27 12 views
17
<plugin> 
    <groupId>com.googlecode.flyway</groupId> 
    <artifactId>flyway-maven-plugin</artifactId> 
    <version>1.7</version> 
    <configuration> 
     <driver>com.mysql.jdbc.Driver</driver> 
     <url>jdbc:mysql://127.0.0.1:3306/db_abc</url> 
     <user>db_user</user> 
     <sqlMigrationPrefix>V</sqlMigrationPrefix> 
    </configuration> 
</plugin> 

Non voglio menzionare driver, URL e utente qui. Ho già uno abc.property su src/main/resources. Come può usare quel file qui?Posso usare il file di proprietà in maven pom.xml per la configurazione del flyway

risposta

30

Dai uno sguardo allo properties-maven-plugin. Ti permette di leggere le proprietà da un file per poi usarle nel tuo pom.

Aggiungere la seguente definizione a plugin:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>properties-maven-plugin</artifactId> 
    <version>1.0.0</version> 
    <executions> 
     <execution> 
     <phase>initialize</phase> 
     <goals> 
      <goal>read-project-properties</goal> 
     </goals> 
     <configuration> 
      <files> 
      <file>src/main/resources/abc.properties</file> 
      </files> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Se abc.properties contiene:

jdbc.driver = com.mysql.jdbc.Driver 
jdbc.url = jdbc:mysql://127.0.0.1:3306/db_ab 
jdbc.user = db_user 

È quindi possibile utilizzare le proprietà come segue:

<!-- language: xml --> 

<driver>${jdbc.driver}</driver> 
<url>${jdbc.url}</url> 
<user>${jdbc.user}</user> 
+0

Grazie mille, funziona come fascino .. – Garry

+5

Per riferimento futuro, questo funziona benissimo, ma è necessario invocare l'inizializzazione di mvn esplicitamente prima di chiamare il plugin flay, ad es. 'mvn initialize flyway: migrate' –

1

Ci sono diversi modi per affrontare con questo. Un approccio è quello di fare il contrario.

Ciò significa che le proprietà da utilizzare vengono salvate come proprietà all'interno dello pom.xml e che il file abc.properties ha solo segnaposto che verranno compilati al momento della compilazione.

Ti mostrerò come può essere configurato.

Questo è ciò che la pom.xml sarà simile:

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.stackoverflow</groupId> 
    <artifactId>Q12619446</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <name>${project.artifactId}-${project.version}</name> 

    <properties> 
     <jdbc.driver>com.mysql.jdbc.Driver</jdbc.driver> 
     <jdbc.url>jdbc:mysql://127.0.0.1:3306/db_abc</jdbc.url> 
     <jdbc.user>db_user</jdbc.user> 
    </properties> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>com.googlecode.flyway</groupId> 
       <artifactId>flyway-maven-plugin</artifactId> 
       <version>1.7</version> 
       <configuration> 
        <driver>${jdbc.driver}</driver> 
        <url>${jdbc.url}</url> 
        <user>${jdbc.user}</user> 
       </configuration> 
      </plugin> 
     </plugins> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
    </build> 
</project> 

E questa sarà la vostra src/main/resources/abc.properties (usare i nomi chiave della vostra scelta):

jdbcDriver = ${jdbc.driver} 
jdbcUrl = ${jdbc.url} 
jdbcUser = ${jdbc.user} 

Dopo la costruzione del target/classes/abc.properties guarderà In questo modo:

jdbcDriver = com.mysql.jdbc.Driver 
jdbcUrl = jdbc:mysql://127.0.0.1:3306/db_abc 
jdbcUser = db_user 

Come indicato questo è solo uno di diversi modi per farlo. Potrebbe non essere adatto alle tue esigenze ma potrebbe farlo.

+2

grazie per la risposta rapida Ma il problema principale è che non voglio dichiarare le proprietà in POM.XML. – Garry

3

nella versione 3.0 è necessario utilizzare configFile come:

<configFile>src/main/resources/db/config/flyway.properties</configFile> 
+0

Nella versione 3.x .. hai configFile come - –

0

Nella versione 3.x si ha l'opzione configFile

By default- flyway.properties in the same directory as the project POM. 

È possibile aggiungere file di proprietà esterno nella sezione di configurazione del pom o può essere passare durante l'esecuzione obiettivo Maven esempio- comando line-

mvn <goal> -Dflyway.configFile=myConfig.properties 

Pom File-

<plugin> 
<groupId>org.flywaydb</groupId> 
<artifactId>flyway-maven-plugin</artifactId> 
<version>3.2.1</version> 
<configuration> 
    <driver/> 
    <url/> 
    <user/> 
    <password/> 
    <baselineVersion>1.0</baselineVersion> 
    <baselineDescription>Base Migration</baselineDescription> 
    <skip>false</skip> 
    <configFile>myConfig.properties</configFile> 
    </configuration> 
</plugin> 
1

Garry,

c'è un altro modo per non mettere i parametri di connessione al database al pom-file. In particolare, è possibile aggiungerli al file settings.xml nella sottocartella .m2 della cartella dell'utente [1].Il vantaggio è che i paranetri db non vivono nella cartella del progetto e non vengono trasmessi al repository, quindi ogni sviluppatore può utilizzare le proprie impostazioni.

L'esempio del file delle impostazioni potrebbe essere simile all'esempio seguente.

<?xml version="1.0" encoding="UTF-8"?> 
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
    <profiles> 
    <profile> 
     <id>fw</id> 
     <properties> 
     <flyway.url>jdbc:oracle:thin:@//localhost:1521/xe</flyway.url> 
     <flyway.user>Your login</flyway.user> 
     <flyway.password>Your password</flyway.password> 
     </properties> 
    </profile> 
    </profiles> 
    <activeProfiles> 
    <activeProfile>fw</activeProfile> 
    </activeProfiles> 
</settings> 

Dopodiché puoi modificare il tuo file pom in base al seguente frammento.

<?xml version="1.0"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    ... 
    <dependencies> 
     ... 
    </dependencies> 

    <profiles> 
     <profile> 
      <id>fw</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.flywaydb</groupId> 
         <artifactId>flyway-maven-plugin</artifactId> 
         <version>3.2.1</version> 
         <configuration> 
          <url>${flyway.url}</url> 
          <user>${flyway.user}</user> 
          <password>${flyway.password}</password> 
         </configuration> 
         <dependencies> 
          <dependency> 
           <groupId>com.oracle</groupId> 
           <artifactId>ojdbc7</artifactId> 
           <version>12.1.0.1.0</version> 
          </dependency> 
         </dependencies> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

Nell'esempio sopra è utilizzato il driver Oracle, ma è possibile sostituirlo con quello richiesto.

Per stampare le impostazioni correnti eseguire quanto segue.

mvn help:effective-settings 
3

A mio parere, il migliore e l'approccio più flessibile è quello di:

a) profili di utilizzo e di filtraggio - mantenere tutte le proprietà di configurazione per profilo specifico (sviluppo, test, etc.) , per esempio in development.properties:

jdbc.url=jdbc:mysql://127.0.0.1:3306/testdb?useSSL=false 
jdbc.user=testuser 
jdbc.password=testpass 
jdbc.driver=com.mysql.jdbc.Driver 

Poi, nel file POM (possibilmente in POM root) definire un profilo, ad esempio:

... 
<profiles> 
    <profile> 
     <id>development</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <build> 
      <filters> 
       <filter>../filters/development.properties</filter> 
      </filters> 
     </build> 
     ... 

qui si può vedere che sviluppo profilo viene attivato per default . Se si desidera utilizzare un altro profilo impostato con

-p [profile-id] 


b) flyway.properties set con filtrati valori - i tuoi flyway.properties dovrebbero sedersi ad esempio in src/main/risorse ed i valori dovrebbero essere utilizzati dai parametri definiti nelle proprietà del profilo del file:

flyway.driver = ${jdbc.driver} 
flyway.url = ${jdbc.url} 
flyway.user = ${jdbc.user} 
flyway.password = ${jdbc.password} 

c) flyway.properties di riferimento da directory di compilazione - uso semplice configurazione del plugin (mi piace molto pulita poms):

... 
    <build> 
     <resources> 
      <!-- This way we instruct maven to inject values from filters into the resources --> 
      <resource> 
       <directory>src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.flywaydb</groupId> 
       <artifactId>flyway-maven-plugin</artifactId> 
       <configuration> 
        <configFile>${project.build.directory}/classes/flyway.properties</configFile> 
        <locations> 
         <location>classpath:migration/mysql</location> 
        </locations> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    ... 

Non dimenticare di abilitare il filtro nelle risorse come mostrato in molti esempi qui. La mia versione del plug-in flyway-maven da è 3.2.1 ed è gestita in pluginManagement nel padre pom, quindi la versione non è visibile qui. Uso anche script sql espliciti con la configurazione delle posizioni.

+0

Se in configFile, specifico il percorso di src/main/resources/flyway.properties, non funziona anche quando compilo prima di migrare. Qualche idea? – rohanagarwal

+0

Cosa succede quando provi a migrare? Hai provato con l'opzione -X in Maven e cosa dice? – user2310395

Problemi correlati