Вопрос

Я использую встроенную базу данных Apache Derby для модульного тестирования в проекте Maven. К сожалению, всякий раз, когда я запускаю тест, я получаю файл derby.log в корневом каталоге проекта. Сама база данных создается в каталоге target ( jdbc: derby: target / unittest-db; create = true ), поэтому это не проблема. Посмотрев справочное руководство , я попытался настроить параметр logDevice в URL JDBC ( jdbc: derby: target / unittest-db; create = true; logDevice = / mylogs ), но, похоже, для другого журнала, следовательно < code> derby.log по-прежнему отображается.

Любая помощь очень ценится.

Это было полезно?

Решение

Вы можете избавиться от derby.log файл, создав следующий класс

public class DerbyUtil {
    public static final OutputStream DEV_NULL = new OutputStream() {
        public void write(int b) {}
    };
}

и настройку системного свойства JVM derby.stream.error .field , например, используя следующий аргумент командной строки JVM:

-Dderby.stream.error.field=DerbyUtil.DEV_NULL

Кредит, которому он должен .

Другие советы

Derby позволяет указать имя файла, в который записываются сообщения журнала ошибок, с помощью системного свойства Java derby.stream.error.file . Значением по умолчанию является derby.log.

Чтобы избавиться от derby.log на этапе тестирования Maven surefire, я просто добавляю определение свойства в конфигурацию плагина следующим образом:

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

Включите в файл derby.properties следующее:

derby.stream.error.file=/dev/null

(или

derby.stream.error.file=\\Device\\Null

в Windows)

Для интеграционных тестов ситуация может быть несколько сложнее, чем простое свойство surefire . Указание свойства derby.stream.error.file в maven-failsafe-plugin не будет работать, поскольку среда сервера не наследуется от этого плагина (очевидно, с использованием maven-surefire-plugin не делает различий).

Вместо этого вам нужно изменить реальный плагин запуска сервера. Следующий пример предназначен для 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>

Обратите внимание, что по какой-то причине мы используем systemProperty , а не просто property , как в верном решении.

Вы также можете просто установить в качестве значения derby home значение target / derby или target с помощью:

System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());

, а затем используйте URL-адрес JDBC jdbc: derby: unittest-db; create = true . Затем derby.log появится в правой папке.

Если у вас нет доступа к конфигурации, вы можете выполнить это до установления соединения:

System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");

Я предложил другое решение. Попробуйте это; это сработало для меня. Здесь я изменил путь System.stream.error.file и установил для него одно из свойств, представленных в моем файле свойств. Просто добавьте приведенный ниже код в файл applicationContext.xml.

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

Это не решение вашей проблемы с файлом derby.log (которую многие люди уже показали, как решить), а скорее предложение. Почему бы не использовать derby-maven-plugin для своих тестов? Он помещает файл derby.log в target / derby , поэтому не оставляет мусора.

Как описано в моем ответе здесь , вы можете использовать Derby в качестве базы данных через плагин derby-maven-plugin, который я написал и который доступен по адресу GitHub и через Maven Central.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top