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:
!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>
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
Pas vrai. L'utilisation de fonctionnalités ou de plugins ne fait aucune différence pour accéder aux classes. –