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.
Est-ce pour le service de profil utilisateur? –
@ 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
Pouvez-vous me dire quel était votre outil? et comment avez-vous ajusté vos autorisations? – user3768904