質問
Maven プロジェクトでの単体テストに Apache Derby 組み込みデータベースを使用しています。残念ながら、テストを実行すると必ず次のような結果になります。 derby.log
プロジェクトのルートにあるファイル。データベース自体は target
ディレクトリ (jdbc:derby:target/unittest-db;create=true
)なのでそれは問題ありません。相談した上で、 リファレンスガイド を設定してみました logDevice
JDBC URL のパラメータ (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
他のヒント
Derbyでは、Javaシステムプロパティ derby.stream.error.file
。デフォルト値は「derby.log」です。
Maven surefireテストフェーズで 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
Windowsの場合)
統合テストの場合、状況は単純なテストよりも少し複雑になる可能性があります。 確実な 財産。プロパティの指定 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
確実な解決策のように。
また、単にderby homeを target / derby
または target
に設定することもできます:
System.setProperty("derby.system.home", new File("target/derby").getAbsolutePath());
次にJDBC URL jdbc:derby:unittest-db; create = true
を使用します。
次に、derby.logが適切なフォルダーに表示されます。
設定にアクセスできない場合は、接続する前にこれを実行できます:
System.setProperty("derby.stream.error.field", "MyApp.DEV_NULL");
別の解決策を思いつきました。これを試してください。それは私のために働いた。ここで行っているのは、System.stream.error.fileパスを変更し、プロパティファイルの下にあるプロパティの1つに設定したことです。以下のコードを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 を使用してみませんか? target / derby
の下に derby.log
ファイルを配置するため、ごみが残りません。
こちらの回答、私が書いたderby-maven-plugin経由でデータベースとしてDerbyを使用できます。これは GitHub およびMaven Central経由。