2017-08-14 2 views
0

Je construis une application E4 et je souhaite utiliser une base de données H2 comme magasin de persistance. Et je me suis souvenu que je devais mettre une bibliothèque externe dans un plugin pour pouvoir y accéder à partir d'une autre application pluigin ou rcp. Donc, j'ai téléchargé le pot à partir du site Web H2 et suivi les étapes décrites ici: http://www.vogella.com/tutorials/EclipseJarToPlugin/article.html J'ai fait les vérifications, tout semblait bien et j'ai inclus le nouveau plugin dans mon plugin d'origine. Par la suite, le MANIFEST.MF de ce plugin originale ressemblait à ceci:H2 Base de données dans E4 Application non résolvable

> Bundle-SymbolicName: mhFinPim;singleton=true Bundle-Version: 
> 1.0.0.qualifier Bundle-Name: mhFinPim Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Require-Bundle: 
> org.eclipse.core.runtime;bundle-version="3.13.0", 
> org.eclipse.swt;bundle-version="3.106.0", 
> org.eclipse.e4.core.di;bundle-version="1.6.100", 
> org.eclipse.e4.ui.di;bundle-version="1.2.100", 
> org.eclipse.e4.core.di.extensions;bundle-version="0.15.0", 
> org.eclipse.e4.ui.workbench;bundle-version="1.5.0", 
> DatabaseH2;bundle-version="1.0.0" 

Le MANIFEST.MF du nouveau plug-in pour la base de données de H2 est celui-ci:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: DatabaseH2 
Bundle-SymbolicName: DatabaseH2 
Bundle-Version: 1.0.0 
Bundle-ClassPath: h2-1.4.196.jar 
Export-Package: org.h2, 
org.h2.api, 
org.h2.bnf, 
org.h2.bnf.context, 
org.h2.command, 
org.h2.command.ddl, 
org.h2.command.dml, 
org.h2.compress, 
org.h2.constraint, 
org.h2.engine, 
org.h2.expression, 
org.h2.fulltext, 
org.h2.index, 
org.h2.jdbc, 
org.h2.jdbcx, 
org.h2.jmx, 
org.h2.message, 
org.h2.mvstore, 
org.h2.mvstore.cache, 
org.h2.mvstore.db, 
org.h2.mvstore.rtree, 
org.h2.mvstore.type, 
org.h2.result, 
org.h2.schema, 
org.h2.security, 
org.h2.server, 
org.h2.server.pg, 
org.h2.server.web, 
org.h2.store, 
org.h2.store.fs, 
org.h2.table, 
org.h2.tools, 
org.h2.upgrade, 
org.h2.util, 
org.h2.value 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 

Après toutes ces étapes, j'ai commencé mon plugin original pour avoir un look, si cela fonctionne et si le plugin va fonctionner avec la base de données. Au début, je reçu ce message d'éclipse et le stacktrace ci-dessous: eclipse message

!SESSION 2017-08-14 09:18:56.882 ----------------------------------------------- 
eclipse.buildId=unknown 
java.version=1.8.0_101 
java.vendor=Oracle Corporation 
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=de_DE 
Framework arguments: -product mhFinPim.prod -clearPersistedState 
Command-line arguments: -product mhFinPim.prod -data C:\Users\te_gza2g3_01\workspace/../runtime-ProdConf.product(1) -dev file:C:/Users/te_gza2g3_01/workspace/.metadata/.plugins/org.eclipse.pde.core/ProdConf.product (1)/dev.properties -os win32 -ws win32 -arch x86_64 -consoleLog -clearPersistedState 

!ENTRY org.eclipse.equinox.app 0 0 2017-08-14 09:18:58.547 
!MESSAGE Product mhFinPim.prod could not be found. 

!ENTRY mhFinPim 2 0 2017-08-14 09:18:58.663 
!MESSAGE Could not resolve module: mhFinPim [5] 
    Unresolved requirement: Require-Bundle: DatabaseH2; bundle-version="1.0.0" 


!ENTRY org.eclipse.osgi 4 0 2017-08-14 09:18:58.665 
!MESSAGE Application error 
!STACK 1 
java.lang.RuntimeException: No application id has been found. 
    at org.eclipse.equinox.internal.app.EclipseAppContainer.startDefaultApp(EclipseAppContainer.java:242) 
    at org.eclipse.equinox.internal.app.MainApplicationLauncher.run(MainApplicationLauncher.java:29) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1499) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1472) 
gogo: IllegalStateException: session is closed 
java.lang.IllegalStateException: session is closed 
    at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:81) 
    at org.apache.felix.gogo.shell.Activator.run(Activator.java:75) 
    at java.lang.Thread.run(Thread.java:745) 

Avant d'utiliser le nouveau plug-in avec la base de données, l'application a commencé witout aucun problème. Si je supprime le plugin de base de données, le démarrage est sans problèmes à nouveau. Donc, je me demande pourquoi éclipse me dit maintenant, qu'aucun id d'application n'est trouvé et pourquoi le plugin ne peut pas être trouvé ?! Est-ce que je dois ajouter quelque chose pour dire à éclipse, où il peut trouver le plugin? Ou ai-je quelque chose d'autre?

BTW, pour donner l'information complète, voici le plugin.xml et la configuration du produit:

<?xml version="1.0" encoding="UTF-8"?> 
<?eclipse version="3.4"?> 
<plugin> 

    <extension 
     id="prod" 
     point="org.eclipse.core.runtime.products"> 
     <product 
      application="org.eclipse.e4.ui.workbench.swt.E4Application" 
      name="FinPim"> 
     <property 
       name="appName" 
       value="FinPim"> 
     </property> 
     <property 
       name="lifeCycleURI" 
       value="bundleclass://mhFinPim/de.mho.finpim.lifecycle.Manager"> 
     </property> 
     </product> 
    </extension> 

</plugin> 


<?xml version="1.0" encoding="UTF-8"?> 
<?pde version="3.5"?> 

<product name="FinPim" uid="ProdConf" id="mhFinPim.prod" application="org.eclipse.e4.ui.workbench.swt.E4Application" useFeatures="true" includeLaunchers="true"> 

    <configIni use="default"> 
    </configIni> 

    <launcherArgs> 
     <programArgs>-clearPersistedState 
     </programArgs> 
     <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts 
     </vmArgsMac> 
    </launcherArgs> 

    <launcher> 
     <win useIco="false"> 
     <bmp/> 
     </win> 
    </launcher> 

    <vm> 
    </vm> 

    <plugins> 
    </plugins> 

    <features> 
     <feature id="fpFeature"/> 
     <feature id="org.eclipse.e4.rcp"/> 
     <feature id="org.eclipse.emf.ecore"/> 
     <feature id="org.eclipse.emf.common"/> 
    </features> 

    <configurations> 
     <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" /> 
     <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" /> 
     <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" /> 
     <plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="2" /> 
     <plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" /> 
    </configurations> 

</product> 

Répondre

0

Vous devez inclure le plugin DatabaseH2 dans la liste des plug-ins inclus dans le produit.

Étant donné que vous utilisez un produit basé sur des fonctions, vous devez le répertorier dans votre fonctionnalité fpFeature. Ouvrez le feature.xml dans fpFeature et ajoutez le plugin DatabaseH2.

+0

En gros, c'est juste! Malheureusement, si j'inclus la base de données dans la fonctionnalité, je ne peux pas accéder aux classes de mon plugin. Je pense que je dois baser mon produit sur des plugins, pas sur des fonctionnalités! – usermho

+0

Pas vrai. L'utilisation de fonctionnalités ou de plugins ne fait aucune différence pour accéder aux classes. –