2009-06-16 37 views
25

Estoy usando la base de datos incrustada Apache Derby para pruebas unitarias en un proyecto Maven. Desafortunadamente, cada vez que ejecuto la prueba, termino con el archivo derby.log en la raíz del proyecto. La base de datos se crea en el directorio target (jdbc:derby:target/unittest-db;create=true), por lo que no es un problema. Después de consultar el reference guide Intenté configurar el parámetro logDevice en la url JDBC (jdbc:derby:target/unittest-db;create=true;logDevice=/mylogs), pero parece ser que para un registro diferente, por lo tanto, todavía aparece derby.log.Deshacerse de derby.log

Cualquier ayuda es muy apreciada.

Respuesta

19

Usted puede deshacerse de derby.log archivo creando la siguiente clase

public class DerbyUtil { 
    public static final OutputStream DEV_NULL = new OutputStream() { 
     public void write(int b) {} 
    }; 
} 

y el ajuste del sistema JVM propiedad derby.stream.error.field, por ejemplo, utilizando el siguiente argumento JVM de línea de comandos:

-Dderby.stream.error.field=DerbyUtil.DEV_NULL 

Credit to whom it is due.

+0

¿Qué sucede si uso Derby a través de Hibernate? ¿Dónde coloco la línea "derby.stream.error.field"? – pek

+0

En una aplicación web, es complicado establecer los accesorios del sistema. ¿Alguna forma de evitarlo? – bmargulies

+0

No lo creo, pero puede configurar las cosas en su configuración web.xml o spring para ejecutar al inicio y hacerlo allí. – stevedbrown

41

Derby le permite especificar el nombre del archivo en el que se escriben los mensajes de registro de errores utilizando el Propiedad del sistema Java derby.stream.error.file. El valor predeterminado es 'derby.log'.

para deshacerse de derby.log durante la fase de prueba infalible Maven, acabo de añadir la definición de la propiedad en la configuración plug-in de la siguiente manera:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <systemProperties> 
      <property> 
       <name>derby.stream.error.file</name> 
       <value>target/derby.log</value> 
      </property> 
     </systemProperties> 
    </configuration> 
</plugin> 
+0

debes preceder al objetivo/con $ {basedir} o de lo contrario no puedes ejecutar maven desde un directorio diferente. – user1050755

+1

Esto funciona perfectamente para las pruebas unitarias, pero generalmente no producirá lo que desea para las pruebas de integración. La razón es que la base de datos generalmente está en el servidor (por ejemplo, embarcadero) que no hereda el entorno de surefire/failsafe. – Fabian

+0

Debería considerar usar la variable $ {project.build.directory} en lugar de codificar la carpeta de destino. $ {project.build.directory} /derby.log fl0w

2

he llegaron con otra solución. Probar esto; funcionó para mí. Lo que estoy haciendo aquí es cambiar la ruta System.stream.error.file y establecerla en una de las propiedades presentes en mi archivo de propiedades. Solo agregue el código proporcionado a continuación a su archivo applicationContext.xml.

<bean id="setDerbyLog" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetClass"><value>java.lang.System</value></property> 
    <property name="targetMethod"><value>setProperty</value></property> 
    <property name="arguments"> 
    <list> 
     <value>derby.stream.error.file</value> 
     <value>${derby.stream.error.file}</value> 
    </list> 
    </property> 
</bean> 
+1

+1 para el truco de primavera del culo malo! :) – carlspring

7

incluir lo siguiente en su archivo derby.properties:

derby.stream.error.file=/dev/null 

(o

derby.stream.error.file=\\Device\\Null 

en Windows)

+0

\\ Dispositivo \\ Null lanzó una excepción FileNotFoundException, pero usar NUL hizo el truco. Gracias. –

+0

Utilicé derby.stream.error.file =./NUL – RockyMM

3

Para la integración pone a prueba la situación podría ser un poco más complicado que la simple propiedad surefire. Especificar la propiedad derby.stream.error.file en el maven-failsafe-plugin no funcionará ya que el entorno del servidor no hereda de ese complemento (obviamente, utilizando maven-surefire-plugin no hay diferencias).

En su lugar, debe modificar el complemento de inicio del servidor real. El siguiente ejemplo es para el maven-jetty-plugin:

<plugin> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <configuration> 
     <systemProperties> 
      <!-- Get rid of that missplaced derby.log. --> 
      <systemProperty> 
       <name>derby.stream.error.file</name> 
       <value>${project.build.directory}/derby.log</value> 
      </systemProperty> 
     </systemProperties> 
    </configuration> 
</plugin> 

Tenga en cuenta que, por alguna razón que utilizamos systemProperty y no sólo property como en la solución segura.

+0

Lo siento, esto es exactamente lo que necesitaba, ESTO debería ser la respuesta aceptada :) – RockyMM

2

Si usted no tiene acceso a la configuración, puede ejecutar esto antes de hacer la conexión:

System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL"); 
+0

Esto es también lo que hice en un método de prueba anotado con '@ BeforeClass' anotación – Stefan

0

Esto no es una solución a su problema de los archivos derby.log, (que numerosas personas ya han mostrado cómo para resolver), sino más bien - una sugerencia. ¿Por qué no utilizar el derby-maven-plugin para sus pruebas? Coloca el archivo derby.log debajo de target/derby, por lo tanto, no deja ningún desperdicio.

Como se describe en my answer here, puede utilizar Derby como su base de datos a través del derby-maven-plugin que escribí y está disponible en GitHub y en Maven Central.

2

Puede también acaba de establecer su casa derby a target/derby o target a través de:

System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath()); 

y luego usar la URL JDBC jdbc:derby:unittest-db;create=true. Luego derby.log aparece en la carpeta derecha.