Se débarrasser de derby.log
Question
J'utilise la base de données intégrée Apache Derby pour les tests unitaires dans un projet Maven. Malheureusement, chaque fois que je lance le test, je me retrouve avec le fichier derby.log
à la racine du projet. La base de données elle-même est créée dans le répertoire target
( jdbc: derby: target / unittest-db; create = true
). Ce n'est donc pas un problème. Après avoir consulté le guide de référence , j'ai essayé de définir le code < > paramètre logDevice sur l'URL JDBC ( jdbc: derby: cible / unittest-db; create = true; logDevice = / mylogs
), mais cela semble être pour un journal différent, par conséquent < code> derby.log apparaît toujours.
Toute aide est très appréciée.
La solution
Vous pouvez vous débarrasser de derby.log
fichier en créant la classe suivante
public class DerbyUtil {
public static final OutputStream DEV_NULL = new OutputStream() {
public void write(int b) {}
};
}
et définition de la propriété système de la JVM derby.stream.error .field
, par exemple, à l'aide de l'argument de ligne de commande JVM suivant:
-Dderby.stream.error.field=DerbyUtil.DEV_NULL
Autres conseils
Derby vous permet de spécifier le nom du fichier dans lequel les messages du journal des erreurs sont écrits à l'aide de la propriété système Java derby.stream.error.file
. La valeur par défaut est 'derby.log'.
Pour supprimer derby.log
lors de la phase de test Maven surefire, il suffit d'ajouter la définition de la propriété dans la configuration du plug-in, comme suit:
<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>
Incluez les éléments suivants dans votre fichier derby.properties:
derby.stream.error.file=/dev/null
(ou
derby.stream.error.file=\\Device\\Null
sous Windows)
Pour les tests d'intégration, la situation peut s'avérer un peu plus compliquée que la simple propriété surefire .
La spécification de la propriété derby.stream.error.file
dans le maven-failafe-plugin
ne fonctionnera pas car l'environnement du serveur n'hériterait pas de ce plugin (avec évidemment maven-sur-fire-plugin
ne fait aucune différence).
À la place, vous devez modifier le plug-in de démarrage du serveur actuel. L'exemple suivant concerne le 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>
Notez que, pour une raison quelconque, nous utilisons systemProperty
et pas seulement propriété
comme dans la solution surfire.
Vous pouvez également définir Derby Home sur target / derby
ou target
via:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
puis utilisez l'URL JDBC jdbc: derby: unittest-db; create = true
.
Ensuite, derby.log apparaît dans le bon dossier.
Si vous n'avez pas accès à la configuration, vous pouvez l'exécuter avant d'établir la connexion:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
J'ai proposé une autre solution. Essayez ceci cela a fonctionné pour moi. Ce que je fais ici, c'est que j'ai changé le chemin d'accès System.stream.error.file et que je l'ai défini sur l'une des propriétés présentes dans mon fichier de propriétés. Ajouter simplement le code ci-dessous à votre fichier applicationContext.xml fonctionnera.
<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>
Ce n'est pas une solution à votre problème de fichier derby.log
(que de nombreuses personnes ont déjà montré comment résoudre), mais plutôt une suggestion. Pourquoi ne pas utiliser le derby-maven-plugin pour vos tests? Il place le fichier derby.log
sous target / derby
, ne laissant ainsi aucune litière.
Comme décrit dans ma réponse ici , vous pouvez utiliser Derby comme base de données via le plugin derby-maven que j’ai écrit et qui est disponible sur GitHub et via Maven Central.