Pergunta
Eu estou usando o banco de dados incorporado Apache Derby para testes de unidade em um projeto Maven. Infelizmente, sempre que eu executar o teste eu acabar com o arquivo derby.log
na raiz do projeto. O próprio banco de dados é criado no diretório target
(jdbc:derby:target/unittest-db;create=true
) de modo que não é um problema. Após consulta do href="http://db.apache.org/derby/docs/10.2/ref/rrefattrib24612.html#rrefattrib24612" guia de referência Eu tentei definindo o parâmetro logDevice
na url JDBC (jdbc:derby:target/unittest-db;create=true;logDevice=/mylogs
), mas que parece ser para um registo diferente, portanto derby.log
ainda aparece.
Qualquer ajuda é muito apreciada.
Solução
Você pode se livrar de derby.log
criando o seguinte classe
public class DerbyUtil {
public static final OutputStream DEV_NULL = new OutputStream() {
public void write(int b) {}
};
}
e definindo a propriedade do sistema JVM derby.stream.error.field
, por exemplo , usando o seguinte argumento de linha de comando JVM:
-Dderby.stream.error.field=DerbyUtil.DEV_NULL
Outras dicas
Derby permite que você especifique o nome do arquivo para o qual as mensagens de log de erro são escritas usando a propriedade do sistema Java derby.stream.error.file
. O valor padrão é 'derby.log'.
Para se livrar de derby.log
durante o Maven infalível fase de testes, eu só adicionar a definição de propriedade na configuração do plugin da seguinte forma:
<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>
Inclua o seguinte em seu arquivo derby.properties:
derby.stream.error.file=/dev/null
(ou
derby.stream.error.file=\\Device\\Null
no Windows)
Para a integração testa a situação poderia ser um pouco mais complicado do que a simples infalível propriedade.
Especificando o derby.stream.error.file
propriedade no maven-failsafe-plugin
não vai funcionar como o ambiente de servidor não herdam esse plugin (obviamente usando maven-surefire-plugin
faz nenhuma diferença).
Em vez disso, é necessário modificar o real plug-in início do servidor. O exemplo a seguir é para o 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>
Note que, por alguma razão que nós usamos systemProperty
e não apenas property
como na solução infalível.
Você também pode apenas definir derby casa para target/derby
ou target
via:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
e, em seguida, usar o jdbc:derby:unittest-db;create=true
JDBC URL.
Em seguida, aparece derby.log na pasta direita.
Se você não tem acesso à configuração, você pode executar este antes de fazer a conexão:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
Eu vim com uma outra solução. Tentar fazer isso; ele trabalhou para mim. O que estou fazendo aqui é que eu mudei o caminho System.stream.error.file e configurá-lo para uma das propriedades presentes em meu arquivo de propriedade. Basta adicionar o código abaixo dada ao seu arquivo applicationContext.xml vai 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>
Esta não é uma solução para o seu problema de arquivo derby.log
, (que muitas pessoas já demonstraram como resolver), mas sim - uma sugestão. Por que não usar o derby maven-plugin do para os testes? Ele coloca o arquivo derby.log
sob target/derby
, portanto, não deixando qualquer lixo.
Como descrito no minha resposta aqui , você pode utilizar o Derby como seu banco de dados através do maven-derby-plugin que eu escrevi e está disponível em GitHub e via Maven Central.