NPE in Win32ShellFolder2.access beim Erstellen eines neuen JFileChooser-Kontos als lokales Systemkonto in Windows 7

Ich habe Unit-Tests für eine Swing-GUI geschrieben, die JFileChooser erstellt. Da die Komponententests auf einem Buildserver als Dienst ausgeführt werden, müssen die Komponententests als lokales Systemkonto ausgeführt werden. Wenn die Unit-Tests jedoch versuchen, einen neuen JFileChooser zu erstellen, lösen sie eine NullPointerException aus.

Ich habe das Problem auf das Ausführen der folgenden Hauptklasse als lokales Systemkonto reduziert (NICHT DER ECHTE CODE).

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");
            }
        });
    }
}

Verwenden Sie die folgende Build-Datei.

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

Wenn ich den Code als mein eigenes Benutzerkonto ausführe, wird der JFileChooser angezeigt (das ist alles, was ich möchte, da der oben beschriebene abgespeckte Code danach offensichtlich nichts mehr tut).

Wenn ich den obigen Code als Systemkonto ausführe (z. B. durch Installieren von PsTools / PsExec und Ausführen vonPsExec.exe -s -i cmd.exe Um cmd als Systemkonto zu starten und dann das jar auszuführen, erhalte ich folgenden Stack-Trace:

 [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)

Wie kann ich ein JFileChooser-Objekt in einer JVM erstellen, die vom lokalen Systemkonto gestartet wurde?

Ich verwende derzeit die 32-Bit-Version von JVM 1.7.0_25 und habe sowohl unter Windows Server 2008 als auch unter Windows 7 getestet. Eine weitere Anforderung bedeutet, dass ich nicht von einer 32-Bit-JVM auf eine 64-Bit-JVM wechseln kann.

Ich habe verschiedene Vorschläge von Google ausprobiert, darunter.

Übergabe von -Dswing.disableFileChooserSpeedFix = trueÜbergabe von -Duser.home =. /Übergabe von -Dtemp.dir = C: / temp

... aber nichts hat das Ergebnis verändert.

Danke für jede Hilfe.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage