2

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/온도

하지만 것도 변경하지 결과.

도움 주셔서 감사합니다.

답변

1

이것은 JVM 문제가 아니며 사용 권한 문제입니다. 필자는 최근에 Windows 10 시스템에서 Java 8v92를 실행하는 유사한 스택 추적을 발견했습니다.

Set Windows Service to use an Admin account

+0

가 이것이다 :

이 문제를 해결하려면, (윈도우 10에서 탭에서 로그를 선택, 발사 서비스를 서비스하고 쇼 속성을 강조) 관리자 계정으로 로그온 할 Windows 서비스를 설정 사용자 프로필 서비스? –

+1

@ skia.heliou 아니요 User Profile 서비스가 아닙니다. 필자의 경우 자동화 된 테스트를 실행 한 도구에서만 문제가 발생했습니다.로컬 워크 스테이션에서 실행할 때 문제가되지 않았습니다. 도구 서비스의 사용 권한을 조정해야했습니다. 희망이 도움이! – sjgp

+0

공구가 무엇인지 말해 주시겠습니까? 어떻게 권한을 조정 했습니까? – user3768904

0

저는 자바 7 문제라고 생각합니다. 버전을 확인하고 다른 버전을 사용해보십시오. 또는 Java 버전을 업그레이드하십시오.

0

필자는 매우 비슷한 문제가 발생했으며 관리자 계정으로 실행되도록 서비스를 구성하는 문제를 해결했습니다 (구성이 아니라 관리자로 시작). 비밀번호가없는 관리자 계정으로는이 작업을 수행 할 수 없습니다 (레지스트리를 만지지 않고도).