Избавляемся от derby.log
Вопрос
Я использую встроенную базу данных 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.