我继承了一个用java编写的用于RCP框架的应用程序(eclipse)。
代码附带了构建系统(maven)和pom文件,似乎一切都在构建。
然而,最终的应用程序exe无法运行。我得到一个错误的弹出窗口,然后是一个描述大量错误的日志文件的链接。问题是,我在RCP上很新,我几乎不知道OSGI是什么,我不明白所有的maven。所以我很难弄清楚问题是什么,甚至在哪里开始。
日志文件的开头如下:
!ENTRY org.eclipse.osgi 4 0 2013-10-14 13:38:14.717!MESSAGE 应用程序错误!STACK 1 java.lang.RuntimeException:Application 无法找到“com.company.prod.app.rcp.application” 注册表中。可用的应用程序是: org.eclipse.equinox.app.error, org.eclipse.help.base.infocenterApplication, org.eclipse.help.base.helpApplication, org.eclipse.help.base.indexTool。在 org.eclipse.equinox.internal.app.EclipseAppContainer.startDefaultApp(EclipseAppContainer.java:242) 在 org.eclipse.equinox.internal.app.MainApplicationLauncher.run(MainApplicationLauncher.java:29) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597)at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)at at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)at at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
!ENTRY org.eclipse.osgi 2 0 2013-10-14 13:38:14.751!MESSAGE One或 由于以下根约束,因此未解析更多捆绑包 未解决:!SUBENTRY 1 org.eclipse.osgi 2 0 2013-10-14 13:38:14.751!MESSAGE Bundle update@plugins/com.company.prod.app.data_2.0.5-SNAPSHOT.jar不是 解决。 !SUBENTRY 2 com.company.prod.app.data 2 0 2013-10-14 13:38:14.751!MESSAGE缺少导入的包microsoft.sql_0.0.0。
!ENTRY org.eclipse.osgi 2 0 2013-10-14 13:38:14.778!MESSAGE 以下是未解析的捆绑包的完整列表,请参阅 根本原因的先前日志条目(如果存在):
然后继续列出应用程序中的每个包,列为0.0.0版。我假设版本号与问题有关,因为它们当然都没有版本0.0.0。
搜索所有pom.xml文件不会将单个依赖项列为版本0.0.0。
我不明白作为“root”原因提到的microsoft.sql_0.0.0导入包的来源。我知道代码使用microsoft.sqlserver。它被导入一个java文件,如下所示:
import com.microsoft.sqlserver.jdbc.SQLServerException;
包含该import语句的包已将microsoft.sqlserver列为依赖项,如下所示:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc</artifactId>
<version>4.0</version>
</dependency>
此外,还有一个导出它的“捆绑”(?),如下所示:
<Export-Package>
org.hsqldb.*,
com.microsoft.sqlserver.*
</Export-Package>
所以,对我而言似乎是导出并正确导入。但我不明白maven那么好(或者它是osgi或rcp错误?甚至不确定)。
另外。我的maven存储库中有sqlserver.sqljdbc,位于:
.m2\repository\com\microsoft\sqlserver\sqljdbc\4.0
任何有关如何尝试解决此问题的提示都将受到赞赏。
答案 0 :(得分:0)
好的,这是我做的一些事情让它发挥作用。我不确定我是否理解了所有内容,但至少应用程序现在可以运行。
我没注意到缺少的导入是microsoft.sql而不是com.microsoft.sqlserver。我不知道microsoft.sql是什么,或者它是如何自动添加到清单文件中的导入的,但它是(可能是com.microsoft.sqlserver.XXXX使用它?)。将microsoft.sql添加到export-package解决了这个问题。
我不相信我的问题与版本0.0.0有任何关系。它似乎只是默认版本,必须在导出/导入部分显式声明才能更改,这在任何地方都不会发生。我把它与各部分搞混了。我不知道OSGI是什么,而且该项目使用的是felix插件。
答案 1 :(得分:0)
好的......我认为你应该首先了解Maven是如何运作的。 你读过Maven documentation了吗?当我第一次使用Maven时,我编写了一个小应用程序,使用Maven包含所有jar依赖项。
简短而有希望的简单解释: 使用Maven,您可以以这种方式管理项目外部的依赖项,所需的工件(即第三方JAR,如de Microsoft SQL驱动程序包)存储在Maven存储库中,并在需要时进行检索。通过这种方式,您可以构建一个中央集线器,用于管理构建工件,也可以使用不同版本。 0_0_0是声明的版本 - 请参阅依赖声明。
毕竟,我认为阅读OSGi article on wikipedia(如果你还没有)并开始使用eclipse RCP教程会很有帮助。日食RCP框架确实很复杂,所以要做出相应的计划。不幸的是,这不是在两三个下午学到的东西。