web-dev-qa-db-fra.com

Eclipse - Echec de la création du fichier JAR "Fichiers de classe sur le chemin de classe introuvables ou inaccessibles pour ..."

J'ai un projet dans Eclipse qui comporte une croix rouge et ne sera pas exporté vers un fichier JAR exécutable. Je ne me souviens pas si je l'ai regardé depuis que j'ai réinstallé Windows sur mon ordinateur portable, mais je sais que je n'ai modifié aucun code. Il n'y a pas d'erreur dans les classes, mais l'erreur que je reçois pointe sur la classe suivante qui traite des éléments de menu sur Mac OSx:

import Java.lang.reflect.*;

public class osxhandler implements InvocationHandler {

      protected Object targetObject;
        protected Method targetMethod;
        protected String proxySignature;

        static Object macOSXApplication;

        // Pass this method an Object and Method equipped to perform application shutdown logic
        // The method passed should return a boolean stating whether or not the quit should occur
        public static void setQuitHandler(Object target, Method quitHandler) {
            setHandler(new HOsx("handleQuit", target, quitHandler));
        }


    public static void setAboutHandler(Object target, Method aboutHandler) {
        boolean enableAboutMenu = (target != null && aboutHandler != null);
        if (enableAboutMenu) {
            setHandler(new HOsx("handleAbout", target, aboutHandler));
        }
        // If we're setting a handler, enable the About menu item by calling
        // com.Apple.eawt.Application reflectively
        try {
            Method enableAboutMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledAboutMenu", new Class[] { boolean.class });
            enableAboutMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enableAboutMenu) });
        } catch (Exception ex) {
            System.err.println("MacOSHandler could not access the About Menu");
            ex.printStackTrace();
        }
    }

       public static void setPreferencesHandler(Object target, Method prefsHandler) {
            boolean enablePrefsMenu = (target != null && prefsHandler != null);
            if (enablePrefsMenu) {
                setHandler(new HOsx("handlePreferences", target, prefsHandler));
            }
            // If we're setting a handler, enable the Preferences menu item by calling
            // com.Apple.eawt.Application reflectively
            try {
                Method enablePrefsMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledPreferencesMenu", new Class[] { boolean.class });
                enablePrefsMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enablePrefsMenu) });
            } catch (Exception ex) {
                System.err.println("MacOSHandler could not access the About Menu");
                ex.printStackTrace();
            }
        }

        // Pass this method an Object and a Method equipped to handle document events from the Finder
        // Documents are registered with the Finder via the CFBundleDocumentTypes dictionary in the 
        // application bundle's Info.plist
        public static void setFileHandler(Object target, Method fileHandler) {
            setHandler(new HOsx("handleOpenFile", target, fileHandler) {
                // Override MacOSHandler.callTarget to send information on the
                // file to be opened
                public boolean callTarget(Object appleEvent) {
                    if (appleEvent != null) {
                        try {
                            Method getFilenameMethod = appleEvent.getClass().getDeclaredMethod("getFilename", (Class[])null);
                            String filename = (String) getFilenameMethod.invoke(appleEvent, (Object[])null);
                            this.targetMethod.invoke(this.targetObject, new Object[] { filename });
                        } catch (Exception ex) {

                        }
                    }
                    return true;
                }
            });
        }

        // setHandler creates a Proxy object from the passed MacOSHandler and adds it as an ApplicationListener
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void setHandler(HOsx adapter) {
            try {
                Class applicationClass = Class.forName("com.Apple.eawt.Application");
                if (macOSXApplication == null) {
                    macOSXApplication = applicationClass.getConstructor((Class[])null).newInstance((Object[])null);
                }
                Class applicationListenerClass = Class.forName("com.Apple.eawt.ApplicationListener");
                Method addListenerMethod = applicationClass.getDeclaredMethod("addApplicationListener", new Class[] { applicationListenerClass });
                // Create a proxy object around this handler that can be reflectively added as an Apple ApplicationListener
                Object MacOSHandlerProxy = Proxy.newProxyInstance(HOsx.class.getClassLoader(), new Class[] { applicationListenerClass }, adapter);
                addListenerMethod.invoke(macOSXApplication, new Object[] { MacOSHandlerProxy });
            } catch (ClassNotFoundException cnfe) {
                System.err.println("This version of Mac OS X does not support the Apple EAWT.  ApplicationEvent handling has been disabled (" + cnfe + ")");
            } catch (Exception ex) {  // Likely a NoSuchMethodException or an IllegalAccessException loading/invoking eawt.Application methods
                System.err.println("Mac OS X Adapter could not talk to EAWT:");
                ex.printStackTrace();
            }
        }

        // Each MacOSHandler has the name of the EAWT method it intends to listen for (handleAbout, for example),
        // the Object that will ultimately perform the task, and the Method to be called on that Object
        protected HOsx(String proxySignature, Object target, Method handler) {
            this.proxySignature = proxySignature;
            this.targetObject = target;
            this.targetMethod = handler;
        }

        // Override this method to perform any operations on the event 
        // that comes with the various callbacks
        // See setFileHandler above for an example
        public boolean callTarget(Object appleEvent) throws InvocationTargetException, IllegalAccessException {
            Object result = targetMethod.invoke(targetObject, (Object[])null);
            if (result == null) {
                return true;
            }
            return Boolean.valueOf(result.toString()).booleanValue();
        }

        // InvocationHandler implementation
        // This is the entry point for our proxy object; it is called every time an ApplicationListener method is invoked
        public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
            if (isCorrectMethod(method, args)) {
                boolean handled = callTarget(args[0]);
                setApplicationEventHandled(args[0], handled);
            }
            // All of the ApplicationListener methods are void; return null regardless of what happens
            return null;
        }

        // Compare the method that was called to the intended method when the MacOSHandler instance was created
        // (e.g. handleAbout, handleQuit, handleOpenFile, etc.)
        protected boolean isCorrectMethod(Method method, Object[] args) {
            return (targetMethod != null && proxySignature.equals(method.getName()) && args.length == 1);
        }

        // It is important to mark the ApplicationEvent as handled and cancel the default behavior
        // This method checks for a boolean result from the proxy method and sets the event accordingly
        protected void setApplicationEventHandled(Object event, boolean handled) {
            if (event != null) {
                try {
                    Method setHandledMethod = event.getClass().getDeclaredMethod("setHandled", new Class[] { boolean.class });
                    // If the target method returns a boolean, use that as a hint
                    setHandledMethod.invoke(event, new Object[] { Boolean.valueOf(handled) });
                } catch (Exception ex) {
                    System.err.println("MacOSHandler was unable to handle an ApplicationEvent: " + event);
                    ex.printStackTrace();
                }
            }
        }    
}

Des idées pour lesquelles je ne peux pas exporter/compiler? Je n'ai jamais eu ce problème auparavant

18
Andy

Il suffit de faire un nettoyage et/ou de reconstruire le projet.

Vous pouvez le trouver dans le menu Project d'Eclipse.

28
adarshr

J'ai également eu un cas différent et dégénéré de ce problème. En fait, nous avions une classe dans notre projet qui avait un fichier (donc Eclipse le gardait dans le chemin de la classe) mais aucune classe réelle définie dans le fichier (le fichier ne contenait que des importations et un commentaire de classe ... probablement une fusion ratée) . Quoi qu'il en soit, la suppression du fichier a résolu le problème.

3
Dkarode

C’est tout à fait odieux qu'Eclipse génère toujours des fichiers cachés .project et .classpath dans le dossier du projet. Parfois, vous ne savez pas si quelque chose ne va pas dans ces fichiers.

Après avoir mis à niveau votre Eclipse et si vous avez trouvé la compilation suivante erreur, je vous suggère de vérifier .classpath dans votre dossier de projet.

Le projet n'a pas été construit car son chemin de construction est incomplet. Ne peux pas recherchez le fichier de classe pour Java.lang.Object. Corrigez le chemin de construction, puis essayez construire ce projet

Très probablement, vous verriez une ligne comme celle-ci.

<classpathentry kind="con" path="org.Eclipse.jdt.launching.JRE_CONTAINER/    org.Eclipse.jdt.internal.debug.ui.launcher.StandardVMType/j2re1.4.2_03"/>

La stupide Eclipse a ajouté cela sans raison. Il suffit simplement de l'enlever pour le faire fonctionner à nouveau. ;)

/org.Eclipse.jdt.internal.debug.ui.launcher.StandardVMType/j2re1.4.2_xx

Source: http://hochit.com/2006/07/06/Eclipse-upgrading-problem-javalangobject-not-found/

De plus, vous pouvez vérifier votre project settings dans Eclipse. Faites un clic droit sur votre projet et choisissez les propriétés. Accédez au chemin de construction Java et vous devriez trouver des informations plus spécifiques sur le problème. Très probablement, vous définissez la variable JDK sur une version qui n'existe pas sur le nouveau système.

Si le problème persiste, sélectionnez votre projet, puis utilisez l’entrée de menu Source->Clean Up.

2
Dennis Kriechel

J'ai eu la même erreur et après avoir essayé plusieurs recommandations, rien n'avait fonctionné. J'ai donc créé un nouvel espace de travail et référé à ce projet. Après cela, il a réussi à construire et à exporter le fichier JAR sans erreur.

0
Mohan Kumar Kannan

Dans mon cas, les classes étaient vides , et le compilateur se plaignit:

Class files on classpath not found or not accessible for: 'ibDemo/src/com/ib/controller/LocationCode.Java'
Class files on classpath not found or not accessible for: 'ibDemo/src/com/ib/controller/PairPanel.Java'

Pour résoudre ce problème, je voudrais ajouter une déclaration de classe:

public class LocationCode
{

}

et 

public class PairPanel
{

}
0
Pedro Lobito

Je me suis référé ici, parce que j'ai eu la même erreur ... Je utilise maven sur Eclipse. J'ai fait un clic droit sur le référentiel, choisi le chemin de construction-> Conifgure build-> Références du projet et vérifié les références du projet pour mon référentiel. Cela a fonctionné pour moi. 

0
sl500059

Je suis venu ici sur la même erreur. Dans mon cas, rien ne compilait (ne construisait?) Et Eclipse ne m'a pas dit qu'il y avait un problème avec la construction autre que ces messages cryptés. J'ai finalement décompressé le fichier jar et constaté qu'il ne contenait aucune classe. C'est parce que le projet que j'ai référencé dans mon chemin de génération n'a pas été construit. Dans mon cas, le projet ne compilerait pas dans un million d’années, mais j’avais accès à des fichiers jar du département de recherche et développement qui le pourraient et le feraient à leur manière. J'ai donc référencé ces fichiers jar à la place. Maintenant, mes cours se compilent et l'erreur disparaît. Je suis sûr que je l'aurais fait en premier lieu mais "serviable", Eclipse m'a suggéré de faire référence au projet non construit, alors j'ai accepté la mauvaise suggestion!

0
EdwardF

Pas sûr que cela puisse être la meilleure solution possible, mais vérifiez le chemin de compilation Java. Je l'ai eu pointant vers un mauvais emplacement à cause de laquelle j'étais confronté à une erreur de classe non trouvée. Une fois le chemin de génération Java corrigé, le problème était résolu.

0
Vaibhav Mishra

J'avais aussi la même erreur. Dans mon cas, le problème était que j'avais placé le même fichier plusieurs fois une fois dans "bibliothèque utilisateur" et la prochaine fois dans "chemin d'accès" sur le même projet. Vient de supprimer les fichiers jar répétés du classpath et l’erreur ci-dessus.

0
RCS