web-dev-qa-db-fra.com

Spécifier la propriété système au projet Maven

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

Je souhaite accéder à une propriété de mon test et de mon application Web (s'exécutant 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?

Le contexte

J'ai pris un projet open source et j'ai réussi à changer la configuration de la base de données pour utiliser JavaDB.

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

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

Le code fonctionne déjà, mais actuellement tout est codé en dur:

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

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

 jdbc:derby:mydb

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

Les tests sont effectués à l'aide de junit (je ne vois pas de plug-in dans pom.xml) et l'application Web s'exécute avec le plug-in Jetty.

Spécifier la propriété système dans la ligne de commande semble fonctionner pour Jetty, mais je ne suis pas sûr que ce soit quelque chose de pratique (à condition que d'autres utilisateurs puissent l'exécuter à partir d'Eclipse/idea/que ce soit).

63
OscarRyz

Existe-t-il un moyen (je veux dire comment je) 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 plug-in Maven Surefire (cela est logique car les tests sont définis par défaut). De en utilisant les propriétés du système :

<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 ma webapp (fonctionnant localement)

Vous ne savez pas exactement ce que vous voulez dire ici, mais je suppose que le conteneur Webapp a été lancé par Maven. Vous pouvez transmettre les propriétés du système sur la ligne de commande en utilisant:

mvn -DargLine="-DpropertyName=propertyValue"

Mise à jour: Ok, je l’ai maintenant. Pour Jetty, vous devriez également pouvoir définir les propriétés du système dans la configuration du plug-in Maven Jetty. De Définition des propriétés du système :

<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>
70
Pascal Thivent

propriétés-maven-plugin 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>
63
yegor256

J'ai appris qu'il est également possible de faire cela avec le plugin exec-maven si vous faites un "standalone" Java app.

            <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>
9
bvesco

Si votre test et votre application Web appartiennent au même projet Maven, vous pouvez utiliser une propriété dans le POM du projet. Ensuite, vous pouvez filtrer certains fichiers, ce qui permettra à Maven de définir la propriété dans ces fichiers. Il existe différentes manières de filtrer, mais la plus courante est celle utilisée pendant la phase de ressources - http://books.sonatype.com/mvnref-book/reference/resource-filtering-sect-description.html

Si le test et l'application Web se trouvent dans différents projets Maven, vous pouvez placer la propriété dans settings.xml, qui se trouve dans le dossier de votre référentiel Maven (C:\Documents and Settings\nomutilisateur.m2) sous Windows. Vous devrez toujours utiliser le filtrage ou une autre méthode pour lire la propriété dans votre test et votre application Web.

2
amram99