IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Problème installation JMonkey avec plugin RCP


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut Problème installation JMonkey avec plugin RCP
    Bonjour,

    J'ai un soucis pour utiliser le moteur 3D JMonkey (JME) sous éclipse RCP 3.5. J'ai crée un plugin JMonkey à partir des .jars que l'on peut télécharger sur le site de JMonkey (http://www.jmonkeyengine.com) puis j'y ai ajouté les librairies qu'il lui faut.
    J'ai ensuite crée mon plugin TestJMonkey afin de tester l'affichage d'un objet 3D et là j'ai un soucis au lancement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: [Lorg/lwjgl/opengl/DisplayMode;
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getDeclaredMethod(Unknown Source)
        at java.awt.Component.isCoalesceEventsOverriden(Unknown Source)
        ...
    Caused by: java.lang.ClassNotFoundException: org.lwjgl.opengl.DisplayMode
        at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:489)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:405)
    ...
    J'ai essayé de le faire fonctionner dans un projet éclipse normal et tout fonctionne bien avec les mêmes jars et les mêmes librairies. Je ne comprends pas pourquoi ça ne fonctionne plus lorsque je passe en mode plugin...

    Si quelqu'un peut m'aider, je peux fournir plus d'infos.

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Par défaut
    Bonjour,

    Eclipse for Java Developper et Eclipse for RCP/Plug-in Developper ne partagent pas très exactement le même noyau. Du coup ils ne contiennent pas à la base le même panel de librairies.
    Néanmoins, si ton projet ne requiert que des dépendances communes aux deux plates-formes, il devrait en principe tourner indifféremment sur les deux.
    Vérifie que le fichier lwjgl.jar se trouve bien dans le classpath de ton plugin.

  3. #3
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    Tout d'abord merci de m'aider. Le jar lwjgl.jar se trouve bien dans le class path et le lien avec sa librairie native est fait.

    Si je garde le même noyau mais en créant un projet normal (tout en restant sous RCP) ça fonctionne très bien mais dès que j'essaye de faire un plugin (je crée une extension Application) là ça plante...

    Je pense que je m'y prends mal mais je ne vois pas de solutions...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Par défaut
    Dans l'arborescence de ton projet sous eclipse RCP, double-cliques sur plugin.xml. Dans la fenêtre qui s'affiche va sur l'onglet Runtime. Dans la section Classpath (en bas à droite de l'écran) vérifies bien que tous les .jar (de jMonkey et autres) que tu as rajoutés au Build Path s'y trouvent aussi. Dans le cas contraire rajoutes-les avec le bouton Add ensuite save le fichier. Reviens sur l'onglet Overview et fais un Update classpath settings grâce au lien en bas à gauche de l'écran.

    Au besoin, dans la fenêtre Run Configurations de ton plug-in, tu pourrais, sous l'onglet Plug-ins cliquer sur le bouton Add required plug-ins pour t'assurer que toute plug-in dépendence est intégrée avant de passer à l'exécution.

    A mon avis, c'est un pb de config et j'espère que ça puisse t'aider.

  5. #5
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    Alors j'ai fait exactement tout ce que tu m'as dit de faire mais j'ai toujours une exception au lancement. Voici le code de ma classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package testjmonkeyplugin;
     
    import org.eclipse.equinox.app.IApplication;
    import org.eclipse.equinox.app.IApplicationContext;
     
    public class TestMain implements IApplication  {
     
        @Override
        public Object start(IApplicationContext context) throws Exception {
            Launch3DScene myScene = new Launch3DScene();
            myScene.launchScene();
            return null;
        }
     
        @Override
        public void stop() {
            // TODO Auto-generated method stub
        }
     
    }
    Celui de la classe censée lancer l'animation 3D :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    package testjmonkeyplugin;
     
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
     
    import com.jme.app.SimpleGame;
    import com.jme.bounding.BoundingBox;
    import com.jme.bounding.BoundingSphere;
    import com.jme.math.Vector3f;
    import com.jme.scene.Node;
    import com.jme.scene.shape.Box;
    import com.jme.scene.shape.Sphere;
    import com.jme.util.export.binary.BinaryImporter;
    import com.jmex.model.converters.FormatConverter;
    import com.jmex.model.converters.MaxToJme;
     
    public class Launch3DScene extends SimpleGame {
     
        public void launchScene() {
            Launch3DScene scene = new Launch3DScene();
            scene.setConfigShowMode(ConfigShowMode.NeverShow);
            scene.start();
            System.out.println("Scène 3D Lancée");
        }
     
        @Override
        protected void simpleInitGame() {
            Box box1 = new Box("Box numero uno", new Vector3f(0,1,0),1,1,1);
            box1.setModelBound(new BoundingBox());
            box1.updateModelBound();
            rootNode.attachChild(box1);
            Box box2 = new Box("Box numero dos", new Vector3f(0,-1,0),10,0.25f,10);
            box2.setModelBound(new BoundingBox());
            box2.updateModelBound();
            rootNode.attachChild(box2);
            Sphere sphere1 = new Sphere("Sphere number one", new Vector3f(0,1,1), 20, 20, 1);
            sphere1.setModelBound(new BoundingSphere());
            sphere1.updateModelBound();
            rootNode.attachChild(sphere1);
            rootNode.setModelBound(new BoundingBox());
            rootNode.updateModelBound();
     
            Node myCube;
            myCube = this.getBlenderObject("BlenderModels\\Monkey.3ds");
            myCube.setModelBound(new BoundingBox());
            rootNode.attachChild(myCube);
            myCube.updateModelBound();
        }
     
        private Node getBlenderObject(String objectPath) {
     
            Node myObject;
            FileInputStream myObjectInputStream;
     
            try {
                myObjectInputStream = new FileInputStream(objectPath);
                FormatConverter converter = new MaxToJme();
                converter.setProperty("mtllib", myObjectInputStream);
                ByteArrayOutputStream BO = new ByteArrayOutputStream();
                try {
                    converter.convert(myObjectInputStream, BO);
                    myObject = (Node) BinaryImporter.getInstance().load(new ByteArrayInputStream(BO.toByteArray()));
                    return myObject;
     
                } catch (IOException e) {
                    System.out.println("Damn exceptions!" + e);
                    e.printStackTrace();
                    System.exit(0);
                }
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            return null;
        }
    }
    Et enfin l'exception levée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    !SESSION 2010-01-07 08:40:14.823 -----------------------------------------------
    eclipse.buildId=unknown
    java.version=1.6.0_17
    java.vendor=Sun Microsystems Inc.
    BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=fr_FR
    Framework arguments:  -application TestJMonkeyPlugin.TestJMonkeyPluginApplication
    Command-line arguments:  -application TestJMonkeyPlugin.TestJMonkeyPluginApplication -data C:\usr\Christophe\Rockwell\Maintenance Application\TestsJMonkey\TestJMonkeyPlugin -dev file:C:/usr/Christophe/Rockwell/Maintenance Application/TestsJMonkey/.metadata/.plugins/org.eclipse.pde.core/JMonkeyPlugin/dev.properties -os win32 -ws win32 -arch x86
     
    !ENTRY org.eclipse.osgi 4 0 2010-01-07 08:40:15.822
    !MESSAGE Application error
    !STACK 1
    java.lang.NoClassDefFoundError: Could not initialize class org.lwjgl.opengl.Display
        at com.jme.system.lwjgl.LWJGLDisplaySystem.close(LWJGLDisplaySystem.java:313)
        at com.jme.app.BaseGame.quit(BaseGame.java:117)
        at com.jme.app.BaseSimpleGame.quit(BaseSimpleGame.java:614)
        at com.jme.app.BaseGame.start(BaseGame.java:107)
        at testjmonkeyplugin.Launch3DScene.launchScene(Launch3DScene.java:25)
        at testjmonkeyplugin.TestMain.start(TestMain.java:11)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1287)
    Je suis sûr que c'est un tout petit soucis qui bloque tout... Quelqu'un de calé en eclipse RCP pourrait-il tester vite fait un nouveau projet en incluant les jars de JMonkey en se servant de mon code ? Ce serait le bonheur car là je ne voit pas le soucis...

    En gros quand j'exécute mon code en tant que "Eclipse Application" ça plante et quand je le lance en "Java Application" ça fonctionne...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Par défaut
    Salut Contrec,

    C'est bien de l'avoir posté ton code. A le voir, ya pas "qu'un petit souci qui bloque tout", Ya de gros tas de truc à refaire

    J'ai jamais eu à bosser avec jMonkey, ni sur du 3D. Donc, j'ai pris mon temps pour downloader la librairie et grâce à une recherche assez intensive sur le net, j'ai pu bidouiller un petit truc qui exécute bien ton code (à l'exception de l'absence du fichier BlenderModels\\Monkey.3ds que je n'ai pas)

    Remarques :Ta classe d'entrée TestMain n'a pas l'air commode. Elle implémente bien IApplication mais n'a pas du tout la structure de celle d'un programme RCP classique. Quelque soit ce que tu veux afficher dans du RCP, tu dois passer par des perspectives, des vues, des éditeurs...C'est pas trop la mm philo qu'une appli java standard. Si jamais, voici un bon article pour commencer. Il récapitule tous les concepts de base: http://www.vogella.de/articles/RichC...m/article.html

    Bon, entrons dans le vif du sujet:
    1- Tu dois mettre en place un environnement te permettant de faire du "jMonkey" dans du "RCP". Il y en a quelques uns, mais j'ai trouvé le projet monklypse qui est gratuit et m'a lair abouti. Donc, dans eclipse fais un install depuis le site : http://rifidi.org/update/.

    2- Je trouve qu'il est plus simple de faire du RCP en partant d'un des templates proposés (ce que j'ai fait). Laisse la classe Application.java intact. C'est elle qui sera l'entrée du programme. Ajoute les dépendances vers les plug-ins org.monklypse.jme2 et org.monklypse.jme.physics en plus des dépendances que tu avais déjà créées avec les librairies jMonkey. Ces nouveaux plug-ins te fournissent les API nécessaires pour charger les classes jMonkey dans le RCP.

    3- Crées une nouvelle classe qui va lancer ton animation. Elle remplacera donc Launch3DScene. Elle hérite de SWTDefaultImplementor qui lui fournit les méthodes permettant de s'interfacer avec jMonkey. Voici la mienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    package test.jmonkey.implementation;
     
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
     
    import org.monklypse.core.SWTDefaultImplementor;
     
    import com.jme.bounding.BoundingBox;
    import com.jme.bounding.BoundingSphere;
    import com.jme.math.Vector3f;
    import com.jme.scene.Node;
    import com.jme.scene.shape.Box;
    import com.jme.scene.shape.Sphere;
    import com.jme.util.export.binary.BinaryImporter;
    import com.jmex.model.converters.FormatConverter;
    import com.jmex.model.converters.MaxToJme;
     
    public class TheGame extends SWTDefaultImplementor {
     
    	public TheGame(int width, int height) {
    		super(width, height);
    	}
     
    	public TheGame() {
    		super(700, 700);
    	}
     
    	@Override
    	public void simpleRender() {
     
    	}
     
    	@Override
    	public void simpleSetup() {
    		Box box1 = new Box("Box numero uno", new Vector3f(0,1,0),1,1,1);
            box1.setModelBound(new BoundingBox());
            box1.updateModelBound();
            rootNode.attachChild(box1);
            Box box2 = new Box("Box numero dos", new Vector3f(0,-1,0),10,0.25f,10);
            box2.setModelBound(new BoundingBox());
            box2.updateModelBound();
            rootNode.attachChild(box2);
            Sphere sphere1 = new Sphere("Sphere number one", new Vector3f(0,1,1), 20, 20, 1);
            sphere1.setModelBound(new BoundingSphere());
            sphere1.updateModelBound();
            rootNode.attachChild(sphere1);
            rootNode.setModelBound(new BoundingBox());
            rootNode.updateModelBound();
     
            Node myCube;
            myCube = this.getBlenderObject("BlenderModels\\Monkey.3ds");
            myCube.setModelBound(new BoundingBox());
            rootNode.attachChild(myCube);
            myCube.updateModelBound();
    	}
     
    	@Override
    	public void simpleUpdate() {
     
    	}
     
    	private Node getBlenderObject(String objectPath) {
     
            Node myObject;
            FileInputStream myObjectInputStream;
     
            try {
                myObjectInputStream = new FileInputStream(objectPath);
                FormatConverter converter = new MaxToJme();
                converter.setProperty("mtllib", myObjectInputStream);
                ByteArrayOutputStream BO = new ByteArrayOutputStream();
                try {
                    converter.convert(myObjectInputStream, BO);
                    myObject = (Node) BinaryImporter.getInstance().load(new ByteArrayInputStream(BO.toByteArray()));
                    return myObject;
     
                } catch (IOException e) {
                    System.out.println("Damn exceptions!" + e);
                    e.printStackTrace();
                    System.exit(0);
                }
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            return null;
        }
    }
    Comme tu peux le voir c'est juste une ré-encapsulation de ta classe.

    4- Tu dois maintenant faire l'affichage depuis la méthode createPartControl du Handle de ta vue. Je te donne la mienne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package test.jmonkey.views;
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.ui.part.ViewPart;
    import org.monklypse.core.JMEComposite;
     
    import test.jmonkey.implementation.TheGame;
     
    public class Monlanceur extends ViewPart {
     
    	public static String ID = "test.jmonkey.monlanceur";
     
    	public Monlanceur() {
    		// TODO Auto-generated constructor stub
    	}
     
    	@Override
    	public void createPartControl(Composite parent) {
    		Composite container = new Composite(parent, SWT.None);
            container.setLayout(new GridLayout(2, true));
            JMEComposite composite = new JMEComposite(container, new TheGame());
            composite.setLayoutData(new GridData(GridData.FILL_BOTH));
    	}
     
    	@Override
    	public void setFocus() {
    		// TODO Auto-generated method stub
    	}
     
    }
    5- Tout est prêt pour l'affichage. Tu le fais dans une perspective que tu auras expressément créée. Moi je l'ai fait dans la perspective principale et voici ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test.jmonkey;
     
    import org.eclipse.ui.IPageLayout;
    import org.eclipse.ui.IPerspectiveFactory;
     
    import test.jmonkey.views.Monlanceur;
     
    public class Perspective implements IPerspectiveFactory {
     
    	public void createInitialLayout(IPageLayout layout) {
    		layout.setEditorAreaVisible(false);
    		layout.addStandaloneView(Monlanceur.ID, true, IPageLayout.LEFT, 1.0f, layout.getEditorArea());
    	}
    }
    Et le tour est joué. Chez moi ça marche. ça devrait aussi être le cas pour toi. Pour info, j'utlise eclipse RCP Galileo SR1.

    En espérant t'avoir été utile

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Problème installation TDLPortIO avec C++ Builder 2010
    Par H3xor dans le forum C++Builder
    Réponses: 6
    Dernier message: 22/02/2011, 19h03
  2. Problème de chargement de plugins RCP
    Par fadjerx dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 25/11/2008, 18h00
  3. Problème installation php avec Apache
    Par DreammyKetty dans le forum Apache
    Réponses: 3
    Dernier message: 15/05/2008, 21h54
  4. Réponses: 2
    Dernier message: 08/08/2006, 09h48
  5. problème installation XMLRAD avec Apache
    Par cdevl dans le forum XMLRAD
    Réponses: 1
    Dernier message: 15/12/2005, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo