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.

Foi útil?

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

crédito a quem é devido .

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 targetvia:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top