2

J'ai écrit des tests unitaires pour une interface graphique Swing qui crée JFileChooser. Comme les tests unitaires sont exécutés sur un serveur de build en tant que service, les tests unitaires doivent être exécutés en tant que compte système local. Cependant, lorsque les tests unitaires tentent de créer un nouveau JFileChooser, ils lancent une exception NullPointerException.NPE dans Win32ShellFolder2.access lors de la création de JFileChooser en tant que compte système local sous Windows 7

J'ai réduit le problème à celui de l'exécution de la classe principale suivante en tant que compte système local (PAS LE CODE REAL)

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

Utilisation du fichier de construction suivant.

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

Si je lance le code comme mon propre compte utilisateur, le JFileChooser apparaît (c'est tout ce que je veux faire que le code dépouillé ci-dessus ne peut évidemment pas faire quoi que ce soit après).

Si je lance le code ci-dessus comme le compte du système (par exemple en installant PsTools/PsExec et en cours d'exécution PsExec.exe -s -i cmd.exe pour démar comme compte système, puis en exécutant le pot, puis-je obtenir la trace de la pile suivante:

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

Comment puis-je créer un objet JFileChooser dans une machine virtuelle Java qui a été lancé par le compte système local?

Je suis actuellement en utilisant la version JVM 1.7.0_25 32bit et ont testé sur Windows Server 2008 et Windows 7. Il y a une autre exigence qui signifie que je ne peux pas passer d'une JVM 32 bits à une JV 64 bits M.

J'ai essayé diverses suggestions de Google, y compris. .

  • Passing = true -Dswing.disableFileChooserSpeedFix
  • passage -Duser.home =/
  • passage -Dtemp.dir = C:/temp

... mais pas changé la résultat.

Merci pour toute aide.

Répondre

1

Il ne s'agit pas d'un problème JVM mais d'un problème d'autorisations. J'ai récemment rencontré une trace de pile similaire exécutant Java 8v92 sur une machine Windows 10.

Pour résoudre ce problème, définissez le service Windows pour ouvrir une session en tant que compte Administrateur (services de lancement, mettre en évidence les propriétés du service et de montrer, sélectionnez l'onglet Connexion dans Windows 10):

Set Windows Service to use an Admin account

+0

Est-ce pour le service de profil utilisateur? –

+1

@ skia.heliou non pas le service de profil utilisateur. Dans mon cas, le problème n'était présent que dans l'outil qui exécutait nos tests automatisés.Ce n'était pas un problème lorsqu'il était exécuté sur un poste de travail local. Nous avons dû ajuster les permissions du service de l'outil. J'espère que cela t'aides! – sjgp

+0

Pouvez-vous me dire quel était votre outil? et comment avez-vous ajusté vos autorisations? – user3768904

0

Je crois que c'est un problème de Java 7. Vérifiez votre version et essayez avec une autre. Ou mettez à jour votre version de Java.

0

Je me suis heurté à un problème très similaire et j'ai réussi à le résoudre en configurant le service à exécuter avec un compte administrateur (dans la configuration, pas seulement en commençant par être un administrateur). Sachez que vous ne pourrez pas le faire avec un compte admin sans mot de passe (enfin, sans toucher au registre).

Questions connexes