【问题标题】:Error: type org.osgi.util.tracker.ServiceTracker does not take parameters错误:org.osgi.util.tracker.ServiceTracker 类型不带参数
【发布时间】:2014-12-16 09:07:18
【问题描述】:

我有一个 OSGi 项目,我正在使用 Maven。在一个包中,我需要导入 org.osgi.util.tracker.ServiceTracker,并创建一个属性:

...
import org.osgi.util.tracker.ServiceTracker;
...

private ServiceTracker<Object, Object> serviceTracker;

我的依赖项中显然有 org.eclipse.osgi,如下所示(我的 pom.xml 的一部分)。

<dependencies>
    <dependency>
        <groupId>org.eclipse</groupId>
        <artifactId>org.eclipse.osgi</artifactId>
        <version>3.8.0.v20120529-1548</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

在 Eclipse 中,我可以找到类的定义。

public class ServiceTracker<S, T> implements 
             ServiceTrackerCustomizer<S, T> 
{
   ...
}

但是,当我通过 maven 命令编译我的项目时:

mvn clean install

我得到了错误:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project <my project name>: Compilation failure: Compilation failure:
[ERROR]  <link to my source code dir>/Activator.java:[75,27] type 
org.osgi.util.tracker.ServiceTracker does not take parameters

到底发生了什么?

【问题讨论】:

  • 你在 pom 或父 pom 中是否有任何其他依赖项?它似乎正在从某个地方获取旧版本的 ServiceTracker 类。
  • 或者父pom中的一个依赖(不是托管的,而是直接的依赖)。顺便说一句:您应该使用 org.osgi.core 和 org.osgi.compendium 依赖项进行“提供”范围的编译,而不是实现规范的工件。
  • @NickWilson:一开始我也和你一样想,所以我尝试单独编译——新建一个独立项目,只声明依赖和属性,编译项目。但错误仍然存​​在。
  • @BalazsZsoldos:此捆绑包将与具有 Equinox 核心的 Karaf 一起部署。因此,在使用 org.osgi.core 编译包时可能会出现很多潜在的运行时错误

标签: java eclipse maven osgi osgi-bundle


【解决方案1】:

我怀疑您正在使用 Java 7 编译代码。OSGi 发布了使用未记录的 -target jsr14 标志编译的类文件。 Javac 7 拒绝从这些类文件中识别通用签名。见http://blog.osgi.org/2012/10/43-companion-code-for-java-7.html

此外,您不应针对 Equinox 实现进行编译,而应针对 OSGi 配套代码 jar 进行编译。您将需要 4.3.1 或更高版本。见http://search.maven.org/#artifactdetails|org.osgi|osgi.core|4.3.1|jar

【讨论】:

  • 谢谢。我将我的 java 降级到 1.6_u45,现在它就像一个魅力。
  • 这些技巧和博文链接真的很有帮助!
猜你喜欢
  • 2014-05-22
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2022-01-23
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多