JFileChooser를 만드는 Swing GUI에 대한 단위 테스트를 작성했습니다. 단위 테스트는 서비스로서 빌드 서버에서 실행되므로 단위 테스트는 로컬 시스템 계정으로 실행해야합니다. 그러나 유닛 테스트가 새 JFileChooser를 만들려고하면 NullPointerException을 발생시킵니다.Windows 7에서 로컬 시스템 계정으로 새 JFileChooser를 만들 때 Win32ShellFolder2.access의 NPE
내가 다음 빌드 파일을 사용하여 로컬 시스템 계정으로 다음과 같은 주요 클래스 (NOT 실제 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");
}
});
}
}
을 실행하는 것과 문제를 감소했습니다. 난 내 자신의 사용자 계정으로 코드를 실행하면
<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를 설치 및 시스템 계정으로 cmd를 시작 PsExec.exe -s -i cmd.exe
를 실행 한 다음 항아리를 실행하여 예를 들어 시스템 계정으로 위의 코드를 (실행한다면, 나는 다음과 같은 스택 추적 얻을 :
[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 비트 JV로 전환 할 수 없다는 것을 의미합니다. 엠.
Google에서 다양한 제안을했습니다. .
- 전달 -Dswing.disableFileChooserSpeedFix = TRUE
- 전달 -Duser.home =/ 지나가는 -Dtemp.dir = C/온도
하지만 것도 변경하지 결과.
도움 주셔서 감사합니다.
가 이것이다 :
이 문제를 해결하려면, (윈도우 10에서 탭에서 로그를 선택, 발사 서비스를 서비스하고 쇼 속성을 강조) 관리자 계정으로 로그온 할 Windows 서비스를 설정 사용자 프로필 서비스? –
@ skia.heliou 아니요 User Profile 서비스가 아닙니다. 필자의 경우 자동화 된 테스트를 실행 한 도구에서만 문제가 발생했습니다.로컬 워크 스테이션에서 실행할 때 문제가되지 않았습니다. 도구 서비스의 사용 권한을 조정해야했습니다. 희망이 도움이! – sjgp
공구가 무엇인지 말해 주시겠습니까? 어떻게 권한을 조정 했습니까? – user3768904