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 parámetro logDevice en la url de JDBC ( 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.

¿Fue útil?

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

Crédito a quien se lo debe .

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top