Избавление от 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
), но, похоже, для другого журнала, поэтому derby.log
все еще появляется.
Любая помощь очень ценится.
Ответы
Ответ 1
Вы можете избавиться от файла 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
Кредит, которому он должен быть.
Ответ 2
Derby позволяет указать имя файла, на который записываются сообщения журнала ошибок, с использованием системного свойства Java derby.stream.error.file
. Значение по умолчанию - "derby.log".
Чтобы избавиться от derby.log
во время фазы тестирования Maven, я просто добавлю определение свойства в конфигурацию плагина следующим образом:
<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>
Ответ 3
Включите в файл derby.properties следующее:
derby.stream.error.file=/dev/null
(или
derby.stream.error.file=\\Device\\Null
в Windows)
Ответ 4
Для тестов интеграции ситуация может быть немного сложнее, чем простое свойство 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
, как в решении surefire.
Ответ 5
Я придумал другое решение. Попробуйте это; это сработало для меня. Что я делаю здесь, я изменил путь 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>
Ответ 6
Если у вас нет доступа к конфигурации, вы можете выполнить это, прежде чем устанавливать соединение:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
Ответ 7
Вы также можете просто установить дерби домой на target/derby
или target
с помощью:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
а затем используйте URL-адрес JDBC jdbc:derby:unittest-db;create=true
.
Затем в правой папке появляется derby.log.
Ответ 8
Это не решение вашей проблемы с файлом derby.log
(которое многие люди уже показали, как его решить), а скорее - предложение. Почему бы не использовать derby-maven-plugin для ваших тестов? Он помещает derby.log
файл под target/derby
, следовательно, не оставляет мусора.
Как описано в моем ответе здесь, вы можете использовать Derby как свою базу данных через поддерживающий derbian-maven-плагин, который я написал и доступен на GitHub и через Maven Central.