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.

Était-ce utile?

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

Crédits à qui cela est dû .

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top