2010-11-05 1 views
17

Definisco le password per i server tramite proprietà che definisco nel mio ~/.m2/settings.xml (potrebbe essere ovunque, anche se include pom.xml) per il mio plug-in di distribuzione. Mi piacerebbe usare le stesse proprietà per i miei test di integrazione. c'è un modo per farlo?Posso inserire proprietà da Maven (password definite in settings.xml) nel mio contenitore Spring?

In caso contrario, c'è un modo conveniente per condividere le proprietà tra Maven e TestNG?

Voglio scrivere una bella suite di test che può essere eseguita su diversi server di integrazione continua, indicando diversi host remoti (sviluppo, test, staging e produzione), senza modificare il codice.

mi sto definendo credenziali per un servizio remoto in settings.xml:

<properties> 
<my.host>http://my.company.com</my.host> 
<my.username>my-un</my.username> 
<my.password>my-pw</my.password> 
</properties> 

Mi piacerebbe essere in grado di fare riferimento le proprietà nella mia unità/test di integrazione (src/test/risorse) utilizzando:

<?xml version="1.0" encoding="UTF-8"?> 
<beans.... 
    <bean class="java.lang.String" id="un"> 
     <constructor-arg value="${my.username}"/> 
    </bean> 
    <bean class="java.lang.String" id="pw"> 
     <constructor-arg value="${my.password}"/> 
    </bean> 
</beans> 

Ci sono delle opzioni per farlo? Qualcun altro l'ha provato prima? Sto scrivendo molti test REST che richiedono l'autorizzazione nei miei test.

Grazie!

risposta

1

È possibile ottenere Maven per sostituire un valore particolare nel file xml quando Maven crea il progetto con un determinato profilo. Quindi, ad esempio, potresti impostare un prfile di prova nel tuo maven pom e quando costruisci con quel profilo il file xml nel tuo jar avrà la proprietà desiderata al suo interno. Guarda this per un esempio.

31

Sicuro. Maven resource filtering è la strada da percorrere.

Ecco un esempio di configurazione (verranno filtrati file corrispondenti *-context.xml, altri no):

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*-context.xml</include> 
      </includes> 
     </resource> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>false</filtering> 
      <excludes> 
       <exclude>**/*-context.xml</exclude> 
      </excludes> 
     </resource> 
    </resources> 
</build> 

Un approccio diverso sarebbe quello di utilizzare il Properties Maven Plugin-write all project properties to a file e riferimento quel file dalla primavera utilizzando the PropertyPlaceholderConfigurer mechanism.

Maven Configurazione: configurazione

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>properties-maven-plugin</artifactId> 
      <version>1.0-alpha-2</version> 
      <executions> 
       <execution> 
        <phase>generate-test-resources</phase> 
        <goals> 
         <goal>write-project-properties</goal> 
        </goals> 
        <configuration> 
         <outputFile>${project.build.testOutputDirectory}/mavenproject.properties</outputFile> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Primavera:

<context:property-placeholder location="classpath:mavenproject.properties"/> 
+0

risposta perfetta +1 –

+0

+1 Esattamente quello che stavo cercando una volta ho letto i documenti. Inizialmente ignorato pensando che "filtrare" fosse qualcos'altro. – marklai

+1

A seconda dei flussi di lavoro c'è il rischio che queste proprietà, in particolare la password, siano mostrate nella build, ad es. in un ambiente CI. –

5

Beh, @seanizer è sulla strada giusta, ma questo può essere semplificata dal momento che si può già impostare le proprietà a Maven. Mettili nel tuo pom e nella tua Spring config, tutto ciò che devi fare è avere accesso a loro, quindi è sufficiente cambiare la tua configurazione come questa.

<beans.... 
    <context:property-placeholder /> 

    <bean class="java.lang.String" id="un"> 
     <constructor-arg value="${my.username}"/> 
    </bean> 
    <bean class="java.lang.String" id="pw"> 
     <constructor-arg value="${my.password}"/> 
    </bean> 
</beans> 

La posizione non è richiesta poiché le proprietà che si sono interessati sono ora impostate come proprietà di sistema da parte di maven. Il PropertyPlaceholderConfigurer funzionerà con quelli così come quelli che sono definiti in un file, che non è richiesto in questo caso specifico. Si noti che è necessario includere lo schema per il contesto .

Vorrei spostarli dalla posizione corrente anche se poiché si tratta di un'impostazione globale, il tuo pom è specifico del progetto, quindi penso che sia il luogo a cui appartiene.

+1

Anche questo funziona (+1), ma solo se i test non sono biforcati. –