Подтвердить что ты не робот

Избавление от 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 все еще появляется.

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

4b9b3361

Ответ 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.