Pregunta
Estoy usando la base de datos integrada Apache Derby para pruebas de unidad en un proyecto de 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 la guía de referencia intenté configurar el jdbc: derby: target / unittest-db; create = true; logDevice = / mylogs
) pero parece ser para un registro diferente, por lo tanto < El código> derby.log todavía aparece.
Cualquier ayuda es muy apreciada.
Solución
Puede deshacerse de derby.log
creando la siguiente clase
public class DerbyUtil {
public static final OutputStream DEV_NULL = new OutputStream() {
public void write(int b) {}
};
}
y configurando la propiedad del sistema JVM derby.stream.error .field
, por ejemplo, utilizando el siguiente argumento de línea de comandos de JVM:
-Dderby.stream.error.field=DerbyUtil.DEV_NULL
Otros consejos
Derby le permite especificar el nombre del archivo en el que se escriben los mensajes de registro de errores utilizando la propiedad del sistema Java derby.stream.error.file
. El valor predeterminado es 'derby.log'.
Para deshacerse de derby.log
durante la fase de prueba de Maven surefire, simplemente agrego la definición de propiedad en la configuración del complemento 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>
Incluya lo siguiente en su archivo derby.properties:
derby.stream.error.file=/dev/null
(o
derby.stream.error.file=\\Device\\Null
en Windows)
Para las pruebas de integración, la situación podría ser un poco más complicada que la simple propiedad surefire .
La especificación de la propiedad derby.stream.error.file
en el maven-failafe-plugin
no funcionará, ya que el entorno del servidor no hereda de ese complemento (obviamente utilizando maven-surefire-plugin
no hace 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 algún motivo, usamos systemProperty
y no solo property
como en la solución surefire.
También puede simplemente establecer el inicio de derby en target / derby
o target
a través de:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
y luego use la URL de JDBC jdbc: derby: unittest-db; create = true
.
Luego derby.log aparece en la carpeta correcta.
Si no tiene acceso a la configuración, puede ejecutar esto antes de establecer la conexión:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
Se me ha ocurrido otra solución. Probar esto; funciono para mi Lo que estoy haciendo aquí es que he cambiado la ruta System.stream.error.file y la he configurado en una de las propiedades presentes en mi archivo de propiedades. Solo agregando el código dado a continuación a su archivo de aplicaciónContext.xml funcionará.
<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>
Esto no es una solución para su problema de archivo derby.log
, (que muchas personas ya han mostrado cómo resolver), sino más bien - una sugerencia. ¿Por qué no usar el derby-maven-plugin para sus pruebas? Coloca el archivo derby.log
debajo de target / derby
, por lo que no deja basura.
Como se describe en mi respuesta aquí , puede utilizar Derby como su base de datos a través del complemento derby-maven que escribí y está disponible en GitHub y a través de Maven Central.