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 parametro logDevice sull'URL JDBC ( 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.

È stato utile?

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

Credito al quale è dovuto .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top