Sbarazzarsi di derby.log
Domanda
Sto usando il database incorporato Apache Derby per test unitari in un progetto Maven. Sfortunatamente ogni volta che eseguo il test finisco con il file derby.log
nella radice del progetto. Il database stesso viene creato nella directory target
( jdbc: derby: target / unittest-db; create = true
) in modo che non sia un problema. Dopo aver consultato la guida di riferimento ho provato a impostare il jdbc: derby: target / unittest-db; create = true; logDevice = / mylogs
) ma quello sembra essere per un log diverso, quindi < code> derby.log appare ancora.
Qualsiasi aiuto è molto apprezzato.
Soluzione
Puoi sbarazzarti di derby.log
creando la seguente classe
public class DerbyUtil {
public static final OutputStream DEV_NULL = new OutputStream() {
public void write(int b) {}
};
}
e impostazione della proprietà di sistema JVM derby.stream.error .field
, ad esempio, utilizzando il seguente argomento della riga di comando JVM:
-Dderby.stream.error.field=DerbyUtil.DEV_NULL
Altri suggerimenti
Derby consente di specificare il nome del file in cui vengono scritti i messaggi del registro errori utilizzando la proprietà di sistema Java derby.stream.error.file
. Il valore predefinito è 'derby.log'.
Per sbarazzarsi di derby.log
durante la fase di test infallibile di Maven, aggiungo semplicemente la definizione della proprietà nella configurazione del plugin come segue:
<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>
Includi quanto segue nel tuo file derby.properties:
derby.stream.error.file=/dev/null
(o
derby.stream.error.file=\\Device\\Null
su Windows)
Per i test di integrazione, la situazione potrebbe essere un po 'più complicata della semplice surefire .
Specificare la proprietà derby.stream.error.file
nel maven-failureafe-plugin
non funzionerà poiché l'ambiente del server non eredita da quel plugin (ovviamente usando maven-surefire-plugin
non fa alcuna differenza).
Invece è necessario modificare il plug-in di avvio del server effettivo. L'esempio seguente è per 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>
Nota che per qualche motivo usiamo systemProperty
e non solo property
come nella soluzione infallibile.
Puoi anche impostare il derby home su target / derby
o target
tramite:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
e quindi utilizzare l'URL JDBC jdbc: derby: unittest-db; create = true
.
Quindi derby.log appare nella cartella giusta.
Se non si ha accesso alla configurazione, è possibile eseguire questa operazione prima di stabilire la connessione:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
Ho trovato un'altra soluzione. Prova questo; ha funzionato per me. Quello che sto facendo qui è che ho cambiato il percorso System.stream.error.file e l'ho impostato su una delle proprietà presenti nel mio file delle proprietà. L'aggiunta del codice indicato di seguito al file applicationContext.xml funzionerà.
<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>
Questa non è una soluzione al problema del file derby.log
, (che numerose persone hanno già mostrato come risolvere), ma piuttosto un suggerimento. Perché non utilizzare il derby-maven-plugin per i tuoi test? Pone il file derby.log
in target / derby
, quindi non lascia rifiuti.
Come descritto in la mia risposta qui , è possibile utilizzare Derby come database tramite il plug-in derby-maven che ho scritto ed è disponibile su GitHub e via Maven Central.