2010-07-12 5 views
44

Existe-t-il un moyen (je veux dire comment) de définir une propriété système dans un projet maven?Spécifier la propriété système au projet Maven

Je souhaite accéder à une propriété de mon test et de ma webapp (en cours d'exécution localement) et je sais que je peux utiliser une propriété système java.

Devrais-je mettre cela dans ./settings.xml ou quelque chose comme ça?

Contexte

Je pris un projet open source et a réussi à modifier la configuration db utiliser JavaDB

Maintenant, dans l'url jdbc pour JavaDB, l'emplacement de la base de données peut être spécifié comme chemin complet (voir: this other question)

ou une propriété du système: derby.system.home

J'ai le code de travail déjà, mais actuellement il est tout hardcoded à:

jdbc:derby:/Users/oscarreyes/javadbs/mydb 

Et je veux supprimer le chemin complet, de le laisser comme:

jdbc:derby:mydb 

Pour ce faire, je dois préciser la propriété du système (derby.system.home) Maven, mais je ne Je ne sais pas comment.

Les tests sont effectués en utilisant junit (je ne vois aucun plugin dans pom.xml) et l'application web fonctionne avec le plugin jetty.

Spécification de la propriété système dans la ligne de commande semble fonctionner pour la jetée, mais je ne suis pas sûr que ce soit quelque chose de pratique (accordé d'autres utilisateurs peuvent l'exécuter à partir eclipse/idée/whatever)

+0

J'ai eu exactement le même problème, quand je me suis déplacé mes tests pour les tests d'intégration (il suffit de les renommer et a ajouté maven-plug-in failsafe. Cette propriété système a cessé de fonctionner. Je devais aussi passer systemPropertyVariables de maven-surefire- plugin dans ce plugin maven-failsafe-plugin La propriété system, configurée dans maven-surefire-plugin, a été ignorée avec les tests d'intégration – Alexandr

Répondre

51

Existe-t-il un moyen (je veux dire comment) de définir une propriété système dans un projet maven? Je veux accéder à une propriété de mon test [...]

Vous pouvez définir les propriétés du système dans la configuration Maven Surefire Plugin (ce qui est logique puisque les tests sont fourchues par défaut). De Using System Properties:

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <systemPropertyVariables> 
      <propertyName>propertyValue</propertyName> 
      <buildDirectory>${project.build.directory}</buildDirectory> 
      [...] 
      </systemPropertyVariables> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 

et mon webapp (fonctionnant localement)

Je ne sais pas ce que vous entendez ici, mais je vais supposer que le conteneur webapp est lancé par Maven.Vous pouvez passer des propriétés du système sur la ligne de commande en utilisant:

mvn -DargLine="-DpropertyName=propertyValue" 

Mise à jour: Ok, maintenant obtenu. Pour Jetty, vous devriez également pouvoir définir les propriétés du système dans la configuration du plugin Maven Jetty. De Setting System Properties:

plug-in
<project> 
    ... 
    <plugins> 
    ... 
     <plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>maven-jetty-plugin</artifactId> 
     <configuration> 
     ... 
     <systemProperties> 
      <systemProperty> 
       <name>propertyName</name> 
       <value>propertyValue</value> 
      </systemProperty> 
      ... 
     </systemProperties> 
     </configuration> 
     </plugin> 
    </plugins> 
</project> 
+0

J'ai été capable de le spécifier sur la ligne de commande mais je ne sais pas si c'est la meilleure solution, je mettrai à jour ma question originale, en attendant +1 – OscarRyz

+1

@Oscar Je vois maintenant. exécuter dans une VM fourchue de sorte que vous devez vraiment définir les propriétés du système dans le sur configuration efire. Et le plugin Maven Jetty fournit des fonctionnalités de configuration similaires. Je suggère de configurer les deux, c'est une bien meilleure option que la ligne de commande en effet. –

+0

Je pensais que tout le monde pouvait lire dans les pensées comme moi ... (d'ailleurs arrête de penser ça !!!) ... Ça a marché parfaitement. Je vous remercie !! – OscarRyz

2

Si votre test et webapp sont dans le même projet Maven, vous pouvez utiliser une propriété dans le projet POM. Ensuite, vous pouvez filtrer certains fichiers qui permettront à Maven de définir la propriété dans ces fichiers. Il existe différentes façons de filtrer, mais est au cours de la phase des ressources les plus courantes - http://books.sonatype.com/mvnref-book/reference/resource-filtering-sect-description.html

Si le test et webapp sont dans différents projets Maven, vous pouvez mettre la propriété en settings.xml, qui est dans votre dossier de repository (C: \ Documents and Settings \ nom_utilisateur.m2) sous Windows. Vous devrez toujours utiliser le filtrage ou une autre méthode pour lire la propriété dans votre test et votre webapp.

+2

En fait j'en ai besoin en tant que propriété System pour pouvoir exécuter System.getProperty ("myproperty"); ' – OscarRyz

45

properties-maven-plugin peut aider:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>properties-maven-plugin</artifactId> 
    <version>1.0.0</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>set-system-properties</goal> 
      </goals> 
      <configuration> 
       <properties> 
        <property> 
         <name>my.property.name</name> 
         <value>my.property.value</value> 
        </property> 
       </properties> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+4

Je ne comprends pas pourquoi maven-surefire-plugin est mentionné pour les choses qui ne sont pas liées au test. Il semble que ce soit une chose complètement distincte du développement/déploiement normal, et je ne comprends pas la confusion. – jjpe

7

Je l'ai appris est aussi possible de le faire avec l'exécutif-maven-plugin si vous faites une application java "autonome" .

  <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>${maven.exec.plugin.version}</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>java</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <mainClass>${exec.main-class}</mainClass> 
       <systemProperties> 
        <systemProperty> 
         <key>myproperty</key> 
         <value>myvalue</value> 
        </systemProperty> 
       </systemProperties> 
      </configuration> 
     </plugin> 
Questions connexes