JFileChooser を作成する Swing GUI の単体テストを作成しました。単体テストはビルド サーバーでサービスとして実行されるため、単体テストはローカル システム アカウントとして実行する必要があります。ただし、単体テストで新しい JFileChooser を作成しようとすると、NullPointerException がスローされます。
私は問題をローカル システム アカウントとして次のメイン クラスを実行する問題に減らしました (実際のコードではありません)。
package com.example.mcgr;
import javax.swing.*;
import java.io.IOException;
public class FileChooserAsSystem {
public static void main(String[] args) throws IOException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.showDialog(null, "Ok");
}
});
}
}
次のビルド ファイルを使用します。
<project>
<target name="clean">
<delete dir="build"/>
</target>
<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="build/jar"/>
<jar destfile="build/jar/FileChooserAsSystem.jar" basedir="build/classes">
<manifest>
<attribute name="Main-Class" value="com.example.mcgr.FileChooserAsSystem"/>
</manifest>
</jar>
</target>
<target name="run">
<java jar="build/jar/FileChooserAsSystem.jar" fork="true"/>
</target>
</project>
自分のユーザー アカウントとしてコードを実行すると、JFileChooser が表示されます (上記のコードを削除すると、その後何も実行されないため、実行したいのはこれだけです)。
上記のコードをシステム アカウントとして実行すると (たとえば、PsTools/PsExec をインストールし、
PsExec.exe -s -i cmd.exe
システム アカウントとして cmd を起動してから jar を実行すると、次のスタック トレースが得られます。
[java] Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
[java] at sun.awt.shell.Win32ShellFolder2.access$200(Win32ShellFolder2.java:72)
[java] at sun.awt.shell.Win32ShellFolder2$1.call(Win32ShellFolder2.java:242)
[java] at sun.awt.shell.Win32ShellFolder2$1.call(Win32ShellFolder2.java:237)
[java] at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
[java] at java.util.concurrent.FutureTask.run(FutureTask.java:166)
[java] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
[java] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[java] at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:502)
[java] at java.lang.Thread.run(Thread.java:724)
ローカル システム アカウントによって起動された JVM 内で JFileChooser オブジェクトを作成するにはどうすればよいですか?
現在、JVM バージョン 1.7.0_25 32 ビットを使用しており、Windows Server 2008 と Windows 7 の両方でテストしました。32 ビット JVM から 64 ビット JVM に切り替えることができないという別の要件があります。
Google からのさまざまな提案を試しました。
- -Dswing.disableFileChooserSpeedFix=true を渡す
- -Duser.home=./ を渡す
- -Dtemp.dir=C:/temp を渡す
...しかし、誰も結果を変えませんでした。
助けてくれてありがとう。