2017-08-14 78 views
0

我正在构建E4应用程序并希望将H2数据库用作持久性存储。我记得,我必须将一个外部库放在一个插件中,以便能够从另一个插件或rcp应用程序访问它。 所以,我从H2网站下载了jar,并按照这里描述的步骤进行:http://www.vogella.com/tutorials/EclipseJarToPlugin/article.html 我做了检查,一切看起来都很好,而且我在原始插件中包含了新插件。此后,这个原来的插件的MANIFEST.MF是这样的:H2 E4中的数据库应用程序无法解析

> 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" 

为H2数据库的新插件的MANIFEST.MF是这一个:

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 

毕竟这些步骤,我开始我的原始插件来看看,如果它工作,并且插件将与数据库一起工作。起初,我收到了日食此消息,并以下堆栈跟踪: 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) 

使用与数据库中的新插件之前,应用程序启动不用其他任何问题。如果我删除数据库插件,开始没有问题了。所以,我想知道为什么日食现在告诉我,没有找到应用程序ID,为什么找不到插件?!我必须添加任何东西来告诉eclipse,它可以在哪里找到插件?还是我浑浑噩噩?

顺便说一句,给予完整的信息,这里的plugin.xml中,产品配置:

<?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> 

回答

0

您必须在插件列表中DatabaseH2插件包含在产品中。

由于您使用的是基于功能的产品,因此您应该在功能fpFeature中列出它。在fpFeature中打开feature.xml并添加DatabaseH2插件。

+0

这基本上是正确的!不幸的是,如果我在功能中包含数据库,我无法访问插件中的类。我想我必须将我的产品基于插件而不是功能! – usermho

+0

并非如此。使用功能或插件对访问类没有任何影响。 –