Вопрос по java, derby, maven-2 – Избавляемся от derby.log

26

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

Буду признателен за любую оказанную помощь.

Ваш Ответ

8   ответов
8

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

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

( или же

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

на винде)

\\ Device \\ Null выдал исключение FileNotFoundException, однако вместо этого сделал NUL. Благодарю.
Я использовал derby.stream.error.file =. / NUL
2

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

System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
Это также то, что я сделал в аннотированном методе испытаний с@BeforeClass аннотирование
3

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

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

а затем используйте URL JDBCjdbc:derby:unittest-db;create=true. Then derby.log appears in the right folder.

3

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

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

Derby позволяет вам указать имя файла, в который записываются сообщения журнала ошибок, используя системное свойство Javaderby.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>
Вы должны добавить целевую / с $ {basedir}, иначе вы не можете выполнить Maven из другого каталога.
Вам следует рассмотреть возможность использования переменной $ {project.build.directory} вместо жесткого кодирования целевой папки. & Lt; & значение GT; $ {project.build.directory} /derby.log</value>
Это отлично работает для модульных тестов, но обычно не дает того, что вы хотите для интеграционных тестов. Причина в том, что база данных обычно находится на сервере (например, на пристани), который не наследует среду от верного / отказоустойчивого.
0

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

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

21

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

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

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

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

Кредит, кому это причитается.

В веб-приложении трудно установить реквизит системы. Любой способ обойти это?
Я так не думаю, но вы можете настроить вещи в своем файле web.xml или в весеннем конфиге для запуска при запуске и сделать это там.
@JoshuaD Не забудьте поймать исключение SecurityException, которое вы получите, если веб-контейнер был реализован для предотвращения установки системных свойств веб-приложениями, что должен предотвращать любой хороший веб-контейнер.
@bmargulies: System.setProperty (& quot; derby.stream.error.field & quot ;, & quot; DerbyUtil.DEV_NULL & quot;);
Что если я использую Derby через Hibernate? Куда мне поставить строку "derby.stream.error.field"?
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 за плохую весеннюю хаку! :)

Похожие вопросы