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 :

Accès à des ressources (images) dans des jars du classpath


Sujet :

Eclipse Platform

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 26
    Points
    26
    Par défaut Accès à des ressources (images) dans des jars du classpath
    Bonjour,

    Je crée une application qui exporte des jars. Ces jars sont dans le classpath de mes projets.

    A chaque fois que j'exporte, je fais un refreshLocal pour être sûr que mes projets sont synchro avec le file system.

    Dans ces jars, j'ai des ressources (des images png) que j'utilise dans une view: Cette vue collecte les images de mes jars (dans un certain chemin comme C:/.../toto.jar!/images/image.png) et utilise les images pour son label provider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Image getImage(Object obj) {
        if (obj instanceof Symbol) {
            Symbol s = (Symbol) obj;
            URL imageURL = s.getImageURL();
            if (imageURL != null) {
                Image image = ImageDescriptor.createFromURL(imageURL).createImage(false);
                if(image != null) {
                    images.put(s,image);
                    return image;
                }
            }
        }
        return DEFAULT_IMAGE;
    }
    Le 1er coup, ca marche bien.
    Je regénère mon JAR, en rajoutent une image, donc une entrée dans la vue.
    Je refreshLocal le workspace et fais viewer.refresh dans ma vue.
    A ce moment là, createImage sur le nouvel élément retourne null.

    En debuggant, je vois que l'inputStream qu'ouvre createImage pour lire l'image, génère une exception (catchée dans URLImageDescriptor.getStream()):

    java.io.FileNotFoundException: JAR entry image/SvgTest2.png not found in C:\Users\hodac\toto.jar
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.jar.JarURLConnection.getInputStream(Unknown Source)
    at java.net.URL.openStream(Unknown Source)
    at com.moow.animator.studio.views.SymbolLabelProvider.getImage(SymbolLabelProvider.java:46)
    at org.eclipse.jface.viewers.WrappedViewerLabelProvider.getImage(WrappedViewerLabelProvider.java:117)
    at org.eclipse.jface.viewers.WrappedViewerLabelProvider.update(WrappedViewerLabelProvider.java:165)
    at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:145)
    at org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(AbstractTableViewer.java:399)
    at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:481)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.runtime.Platform.run(Platform.java:888)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2111)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefreshAll(AbstractTableViewer.java:752)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:649)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:636)
    at org.eclipse.jface.viewers.StructuredViewer$7.run(StructuredViewer.java:1457)
    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1392)
    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1353)
    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1455)
    at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:537)
    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1414)
    at com.moow.animator.studio.views.SymbolView$1.run(SymbolView.java:95)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
    at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:452)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3910)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3503)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at com.moow.animator.studio.application.intro.Application.start(Application.java:20)
    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)
    java.io.FileNotFoundException: JAR entry image/SvgTest2.png not found in C:\Users\xxxxxxx\My Documents\My Dropbox\xxxxxxxxxxx\xxxxxxxSymbols\toto.jar
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.jar.JarURLConnection.getInputStream(Unknown Source)
    at java.net.URL.openStream(Unknown Source)
    at com.moow.animator.studio.views.SymbolLabelProvider.getImage(SymbolLabelProvider.java:46)
    at org.eclipse.jface.viewers.WrappedViewerLabelProvider.getImage(WrappedViewerLabelProvider.java:117)
    at org.eclipse.jface.viewers.WrappedViewerLabelProvider.update(WrappedViewerLabelProvider.java:165)
    at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:145)
    at org.eclipse.jface.viewers.AbstractTableViewer.doUpdateItem(AbstractTableViewer.java:399)
    at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:481)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.runtime.Platform.run(Platform.java:888)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2111)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefreshAll(AbstractTableViewer.java:752)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:649)
    at org.eclipse.jface.viewers.AbstractTableViewer.internalRefresh(AbstractTableViewer.java:636)
    at org.eclipse.jface.viewers.StructuredViewer$7.run(StructuredViewer.java:1457)
    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1392)
    at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1353)
    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1455)
    at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:537)
    at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1414)
    at com.moow.animator.studio.views.SymbolView$1.run(SymbolView.java:95)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
    at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:452)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3910)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3503)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at com.moow.animator.studio.application.intro.Application.start(Application.java:20)
    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)
    Que se passe-t-il?

    Merci d'avance pour votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 79
    Points : 73
    Points
    73
    Par défaut
    Bonjour,

    ça me parait bizarre ta façon de lire les jars (vers un chemin en C:\...) alors qu'ils sont dans le classpath comme tu dis.

    Du moment où ton jar est dans le classpath, tu le lis directement à partir du classpath, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream is = TaClasseOuTuCharges.class.getClassLoader()
                        .getResourceAsStream(nonTomImage);
    Autre point, les images que tu construis du dois libérer leur ressources avec SWT ! le garbage collector marche pas là-dessus !! il faut utiliser ImageRegistry, sinon tu risques d'avoir des fuites de mémoires.

    Bonne chance

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    salut,

    en fait, je ne suis pas dans un projet. Il ne tourne pas. Je suis dans le workbench et a priori n'a pas chargé les classes de tous les classpath de tous les projets, Me trompe-je?

    sinon, effectivement, je l'ai pas mis dans le post, mais je dispose des images dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	@Override
    	public void dispose() {
    		super.dispose();
    		disposeImages();
    	}
     
    	public void disposeImages() {
    		for (Image image : images.values()) {
    			image.dispose();
    		}
    		images.clear();
    	}
    donc pour le moment, je ne vois que ma maniere de faire pour atteindre une ressource non loadée.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 79
    Points : 73
    Points
    73
    Par défaut
    Je comprends ce qui tu développes : une appli RCP ? un plugin pour Eclipse ?

    Dans le fichier de config du plugin (le fameux MANIFEST.MF, onglet Runtime), tu peux configuer les dépendances vers les jars

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Je développe une application RCP qui embarque JDT. Cette application permet de créer des projets dont une nature est JAVA + une autre.

    Les objets que je gere sont donc des projets java avec des actions+src+classpath+resources spécifiques et préremplies.

    J'ai une vue qui veut récupérer des ressources de tous mes projets pour les afficher dans une vue synthétique. Ces resources sont dans des jars de mes projets (images).

    Une action de mes projet est un export de jar contenant ces resources.

    Donc quand j'exécute cette action, je veux que cette vue se mette a jour: le refresh fait un parcours de tous les projets, et pour chacun demande une liste d'images dont le url est jar:file/...

    c'est + clair, ou pas encore? dis moi...


    Citation Envoyé par fadjerx Voir le message
    Je comprends ce qui tu développes : une appli RCP ? un plugin pour Eclipse ?

    Dans le fichier de config du plugin (le fameux MANIFEST.MF, onglet Runtime), tu peux configuer les dépendances vers les jars

Discussions similaires

  1. Maintien des icônes et images dans un .jar
    Par BenkessiratAmina dans le forum Général Java
    Réponses: 18
    Dernier message: 13/01/2015, 18h56
  2. Réponses: 1
    Dernier message: 27/04/2012, 16h41
  3. Réponses: 5
    Dernier message: 09/09/2011, 23h07
  4. chargement image dans un JAR retournant des NullPointerException
    Par Balbuzard dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 30/11/2008, 14h00
  5. Réponses: 4
    Dernier message: 14/10/2003, 08h58

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