NPE в Win32ShellFolder2.access при создании нового JFileChooser в качестве учетной записи локальной системы в Windows 7
Я написал модульные тесты для Swing GUI, который создает JFileChooser. Поскольку модульные тесты выполняются на сервере сборки в качестве службы, модульные тесты должны запускаться как локальная системная учетная запись. Однако когда модульные тесты пытаются создать новый 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)
Как я могу создать объект JFileChooser в JVM, который был запущен локальной системной учетной записью?
В настоящее время я использую 32-битную версию JVM 1.7.0_25 и проверил как на Windows Server 2008, так и на Windows 7. Есть еще одно требование, которое означает, что я не могу перейти с 32-битной JVM на 64-битную JVM.
Я пробовал различные предложения от Google, в том числе.
Передача -Dswing.disableFileChooserSpeedFix = trueПередача -Duser.home =. /Передача -Dtemp.dir = C: / temp... но никто не изменил результат.
Спасибо за любую помощь.