2010-07-12 16 views
44

¿Hay alguna forma (es decir, cómo puedo) establecer una propiedad del sistema en un proyecto de maven?Especifique la propiedad del sistema para el proyecto de Maven

Quiero acceder a una propiedad de mi prueba y mi aplicación web (ejecutándose localmente) y sé que puedo usar una propiedad del sistema Java.

¿Debo poner eso en ./settings.xml o algo así?

Contexto

Tomé un proyecto de código abierto y lograron cambiar la configuración db utilizar JavaDB

Ahora, en la URL de JDBC para JavaDB, la ubicación de la base de datos podría ser especificado como el ruta completa (ver: this other question)

O una propiedad del sistema: derby.system.home

tengo el código de trabajo ya, pero en la actualidad es todo codificada a:

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

Y quiero eliminar la ruta completa, dejarlo así:

jdbc:derby:mydb 

para hacer eso necesito especificar la propiedad del sistema (derby.system.home) a maven, pero Don no sé cómo

La prueba se realiza utilizando junit (no veo ningún complemento en pom.xml) y la aplicación web se ejecuta con el plugin jetty.

Especificación de la propiedad del sistema en la línea de comandos parece funcionar para muelle, pero no estoy seguro si eso es algo práctico (otorgado algunos otros usuarios pueden ejecutar desde Eclipse/idea/lo que sea)

+0

que tenían exactamente el mismo problema, cuando me mudé mis pruebas para las pruebas de integración (sólo les renombrado y añadido a prueba de fallos maven-plugin. Esta propiedad del sistema dejó de funcionar. Yo también tenía que mover systemPropertyVariables de maven-surefire- plugin en este plugin de maven-failsafe. La propiedad del sistema, configurada en maven-surefire-plugin, se ignoró con las pruebas de integración. – Alexandr

Respuesta

51

¿Hay alguna manera (es decir, cómo puedo) establecer una propiedad del sistema en un proyecto de maven? Quiero tener acceso a una propiedad de mi prueba de [...]

Puede establecer las propiedades del sistema en la configuración Maven Surefire Plugin (esto tiene sentido ya que las pruebas son bifurcadas por defecto). 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> 

y mi aplicación web (que se ejecuta localmente)

No está seguro de lo que quiere decir aquí, pero voy a asumir el contenedor webapp es iniciado por Maven.Puede pasar las propiedades del sistema en la línea de comandos usando:

mvn -DargLine="-DpropertyName=propertyValue" 

Actualización: Ok, lo tengo ahora. Para Jetty, también debería poder establecer las propiedades del sistema en la configuración de Maven Jetty Plugin. De Setting System Properties:

<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

Pude especificar eso en la línea de comandos, pero realmente no sé si esa es la mejor manera. Actualizaré mi pregunta original. Mientras tanto, +1 – OscarRyz

+1

@Oscar lo veo ahora. Mientras escribía, JUnit prueba ejecutar en una VM bifurcada por lo que realmente tiene que establecer las propiedades del sistema en el sur configuración de efire Y el Maven Jetty Plugin proporciona instalaciones de configuración similares. Sugiero configurar ambos, esta es una opción mucho mejor que la línea de comando. –

+0

Pensé que todos podían leer las mentes como yo ... (¡por favor, deja de pensar eso!) ... Eso funcionó a la perfección. Gracias !! – OscarRyz

2

Si la prueba y webapp están en el mismo proyecto Maven, puede usar una propiedad en el POM del proyecto. Luego puede filtrar ciertos archivos que le permitirán a Maven establecer la propiedad en esos archivos. Hay diferentes maneras de filtrar, pero la más común es durante la fase de recursos: http://books.sonatype.com/mvnref-book/reference/resource-filtering-sect-description.html

Si la prueba y la aplicación web están en diferentes proyectos de Maven, puede poner la propiedad en settings.xml, que está en su carpeta de repositorio maven (C: \ Documents and Settings \ username.m2) en Windows. Todavía necesitará usar el filtrado u otro método para leer la propiedad en su prueba y aplicación web.

+2

Realmente lo necesito como una propiedad del sistema, así que puedo ejecutar 'System.getProperty (" myproperty ");' – OscarRyz

45

properties-maven-plugin plug-in puede ayudar:

<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

No entiendo por qué maven-surefire-plugin se menciona para cosas que no están relacionadas con las pruebas. Parece que es una cosa completamente separada del desarrollo/implementación normal, y no entiendo la fusión. – jjpe

7

He aprendido también es posible hacer esto con el ejecutivo-maven-plugin de si está haciendo un "independiente" de la aplicación java .

  <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> 
Cuestiones relacionadas