سؤال
أنا أستخدم قاعدة بيانات 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
لا يزال يظهر.
أي مساعدة هي محل تقدير كبير.
المحلول
ويمكنك التخلص من 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
نصائح أخرى
وديربي يتيح لك تحديد اسم الملف الذي تتم كتابة رسائل سجل خطأ باستخدام الخاصية نظام جافا <لأ href = "http://db.apache.org/derby/docs/10.8/ref/rrefproper33027. أتش تي أم أل "يختلط =" noreferrer "> derby.stream.error.file
. القيمة الافتراضية هي "derby.log".
لتخلص من derby.log
خلال مرحلة الاختبار مؤكدة النجاح مخضرم، أنا فقط إضافة تعريف خاصية في تكوين المساعد على النحو التالي:
<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
وعلى ويندوز)
لدمج الاختبارات الوضع قد يكون قليلا أكثر صعبة من مؤكدة النجاح الممتلكات.
تحديد 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
كما هو الحال في الحل مؤكدة النجاح.
ويمكنك أيضا تعيين فقط دربي موطن لtarget/derby
أو target
via:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
ومن ثم استخدام URL jdbc:derby:unittest-db;create=true
JDBC.
ثم يظهر 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 الذي كتبته وهو متاح على جيثب وعبر مافن سنترال.