NPE в Win32ShellFolder2.access при создании нового JFileChooser в качестве учетной записи локальной системы в Windows 7

Я написал модульные тесты для графического интерфейса Swing, который создает 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 в качестве системной учетной записи, а затем запустив банку, я получу следующую трассировку стека:

 [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

... но ничего не изменило результат.

Спасибо за любую помощь.


person user1857450    schedule 12.05.2014    source источник


Ответы (3)


Это не проблема JVM, а проблема с разрешениями. Недавно я столкнулся с похожей трассировкой стека, работающей с Java 8v92 на компьютере с Windows 10.

Чтобы исправить это, настройте службу Windows для входа в систему с учетной записью администратора (запустите службы, выделите службу и отобразите свойства, выберите вкладку «Вход в систему» ​​в Windows 10):

Настроить службу Windows на использование учетной записи администратора

person sjgp    schedule 18.08.2016
comment
Это для службы профилей пользователей? - person skia.heliou; 14.02.2017
comment
@skia.heliou нет, это не служба профилей пользователей. В моем случае проблема присутствовала только в инструменте, который запускал наши автоматические тесты. Это не было проблемой при запуске на локальной рабочей станции. Нам пришлось настроить разрешения службы инструмента. Надеюсь это поможет! - person sjgp; 14.02.2017
comment
Скажите, пожалуйста, какой у вас инструмент? и как вы настроили свои разрешения? - person user3768904; 04.11.2017
comment
@ user3768904 наши модульные тесты были написаны с использованием jUnit, определены для выполнения в сценарии Ant и запущены через Jenkins. Тест, который зависел от JFileChooser, выполнялся нормально при запуске через Eclipse или локальный запуск Ant, но не выполнялся на сервере. Я изменил службу Jenkins с разрешениями, описанными выше. Надеюсь это поможет. - person sjgp; 06.11.2017

Я считаю, что это проблема Java 7. Проверьте свою версию и попробуйте другую. Или обновите версию Java.

person ferchoman09    schedule 10.06.2014

У меня была очень похожая проблема, и мне удалось решить ее, настроив службу для запуска с учетной записью администратора (в конфигурации, а не просто запуская ее как администратора). Имейте в виду, что вы не сможете сделать это с учетной записью администратора, у которой нет пароля (ну, не трогая реестр).

person Mastrius    schedule 30.10.2014