在我的 Eclipse RCP 项目中,我使用的是一个自创建的库(库 A),该库也在其他 Java 项目中使用,这些项目不是 Eclipse RCP 项目。
我可以将此库作为 Maven 依赖项添加到目标平台,并且 Tycho 成功地选择它来构建项目。到目前为止,这符合预期。
问题:当我在 Eclipse (IDE) 中打开库时,Eclipse 将 RCP 插件中使用的库(库 A)视为与我的工作区中打开的版本不同。例如,如果我从 RCP 插件中的类跳转到库 A 中的类(通过 CTRL + 单击),Eclipse 将打开 .class 文件,而不是工作区中的 .java 文件。
此外,在 RCP 插件中搜索库 A 中的类也不会出现。
问题:如何配置我的 Eclipse RCP 项目,以便 Eclipse 识别 RCP 插件中使用的库与我工作区中的库相同,并允许在它们之间进行正确的导航和搜索?
由于库 A 是作为普通 JAR 构建的,因此我怀疑人工创建的包装器插件是问题所在。 因此,我通过修改库 A 的
pom.xml
将库 A 转换为 OSGi 包。我补充道:
<packaging>bundle</packaging>
和
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>5.1.9</version>
<extensions>true</extensions>
<configuration>
<excludeDependencies>*</excludeDependencies>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<BundleVersion>${project.version}</BundleVersion>
<Export-Package>*</Export-Package>
</instructions>
</configuration>
</plugin>
在目标平台定义文件中,我更改了库 A 的条目。 我将
missingManifest
更改为 error
,将 type
更改为 bundle
。
<location includeDependencyDepth="direct" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven" label="libA">
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>A</artifactId>
<version>5.1.0-SNAPSHOT</version>
<type>bundle</type>
</dependency>
</location>
起初 Eclipse 没有接受这些更改,因为我的本地和远程 Maven 存储库中仍然有一个较旧的 A-Snapshot,显然也在一些 Eclipse 缓存中。 (增加版本号可能有助于解决此类冲突。) Eclipse 视图目标平台状态对于确定 Eclipse 是使用工作区还是本地 Maven 存储库中的库 A 非常有帮助。
总之,将自己创建的库转换为 OSGi 包解决了问题。