2009-06-16 5 views
25

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

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

ответ

19

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

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

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

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

Credit to whom it is due.

+0

Что делать, если я использую Derby через Hibernate? Где мне поставить строку «derby.stream.error.field»? – pek

+0

В webapp это боль, чтобы установить системные реквизиты. Все вокруг? – bmargulies

+0

Я так не думаю, но вы можете настроить вещи в своем web.xml или spring config для запуска при запуске и сделать это там. – stevedbrown

41

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

you shoudl preend target/с $ {basedir}, иначе вы не сможете выполнить maven из другого каталога. – user1050755

+1

Это отлично работает для модульных тестов, но, как правило, не дает того, что вы хотите для тестов интеграции. Причина в том, что база данных обычно находится на сервере (например, причал), который не наследует среду от надежного/отказоустойчивого. – Fabian

+0

Вам следует рассмотреть возможность использования переменной $ {project.build.directory} вместо жесткого кодирования целевой папки. $ {project.build.directory} /derby.log fl0w

2

я придумал другое решение. Попробуйте это; это сработало для меня. Что я делаю здесь, я изменил путь 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> 
+1

+1 для плохой оспы Весенний взлом! :) – carlspring

7

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

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

(или

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

на Windows)

+0

\\ Device \\ Null бросил FileNotFoundException, однако используя NUL вместо этого сделал трюк. Благодарю. –

+0

Я использовал derby.stream.error.file =./NUL – RockyMM

3

Для интеграции тестов ситуация может быть немного больше, сложнее, чем простое свойство 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 как в растворе верный.

+0

Извините, это именно то, что мне нужно, ЭТО должен быть принятым ответом :) – RockyMM

2

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

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

Это то же, что я сделал в аннотированном методе тестирования с '@ BeforeClass' аннотирование – Stefan

0

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

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

2

Вы также можете просто установить дерби домой target/derby или target через:

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

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

Смежные вопросы