Maven构建 - 强制使用更新版本

时间:2015-04-06 23:01:17

标签: java maven build osgi protege

我正在尝试从源代码构建protege-server(https://github.com/protegeproject/org.protege.owl.server)。我下载了源代码。使用“mvm -X package”会产生以下错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
0:compile (default-compile) on project org.protege.owl.server: Compilation failu
re
[ERROR] /c:/Users/user/Programs/webprotege/org.protege.owl.server-master/src/mai
n/java/org/protege/owl/server/connect/local/OSGiLocalTransport.java:[11,32] type
 org.osgi.framework.ServiceRegistration does not take parameters

根据上一个问题,OSGI博客文章解释说该问题已在该库的后期版本(4.3.1)中修复。

我试图在POM.xml文件中引用该库的更新版本:

<dependency>
            <groupId>org.osgi</groupId>
            <artifactId>core</artifactId>
            <version>6.0.0</version>
             <scope>system</scope>
            <systemPath>/c:/Users/user/Downloads/osgi.core-6.0.0.jar</systemPath>
        </dependency>

甚至下载了较新版本以专门定位它。

错误仍然存​​在。有什么办法可以解决吗?

编辑:

尝试@Balazs Zsoldos建议的解决方案没有帮助,我收到了同样的错误消息。我注意到这个包的引入(org.osgi.framework)引用版本1:

  <Bundle-Activator>org.protege.owl.server.Activator</Bundle-Activator>
                <Bundle-SymbolicName>org.protege.owl.server</Bundle-SymbolicName>
                <Bundle-Vendor>The Protege Development Team</Bundle-Vendor>
                <Embed-Dependency>antlr, antlr-runtime, stringtemplate</Embed-Dependency>
                <Export-Package>org.protege.owl.server*;version=2.0.6-SNAPSHOT</Export-Package>
                <Import-Package>!org.antlr.stringtemplate, 
                            !org.apache.commons.cli,
                            org.osgi.framework;version="1",
                            *</Import-Package>

尝试删除此行也没有帮助,因为它出现在另一个依赖关系下游。我无法找到如何覆盖下游import-package指令。

由eclipse生成的有效pom.xml附加为链接:https://docs.google.com/document/d/1eHFalUHVZ45ejLes_eqaXLw6ttjcTryphbGr_CKbhRk/edit?usp=sharing

1 个答案:

答案 0 :(得分:0)

问题是旧版本的osgi.core仍然在它们的类路径中,因为它们是使用不同的组和工件ID导入的。将pom.xml拖放到eclipse中,然后查看pom编辑器的Dependency Hierarchy选项卡以获取更多信息。

以下两个是依赖项导入的:

  • org.osgi:org.osgi.core (org.apache.felix.log)
  • org.apache.felix:org.osgi.core (由owlapi发布)

要解决此问题,您应添加以下依赖项:

<dependency>
    <groupId>org.osgi</groupId>
    <artifactId>org.osgi.core</artifactId>
    <version>6.0.0</version>
    <scope>provided</scope>
</dependency>

因为这不会覆盖 org.apache.felix:org.osgi.core 依赖关系,所以排除那个:

<dependency>
    <groupId>net.sourceforge.owlapi</groupId>
    <artifactId>owlapi-distribution</artifactId>
    <version>3.4.5</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.osgi.core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

(并删除系统范围的依赖关系,因为您不需要它,并且其artifactId与标准不同)。

修改

刚才意识到旧的osgi.core包也在 org.apache.felix:org.apache.felix.framework 里面,由 ProtegeLauncher 通过<传递EM> org.apache.felix:org.apache.felix.main:4.0.3 。这意味着你应该

  • org.apache.felix:org.apache.felix.main 的版本增加到最新版本(或至少实现osgi 4.3的版本)。在这种情况下,您根本不需要osgi.core
  • edu.stanford.protege:ProtegeLauncher 中排除 org.apache.felix:org.apache.felix.main (并保留osgi的4.3.1或更高版本。核心)

我尝试了第二个问题,另一个问题是无法从maven中心下载surfire插件(或类似的东西,你会看到)。

备注

这个protege库的开发人员显然不熟悉maven依赖管理的工作原理以及应该作为依赖项导入的内容。该项目传递一个永远不会发生的OSGi运行时环境。对于编译,只应导入API,如果目标运行时肯定包含该API,则应使用提供的范围导入API。我建议

  • 不使用此库或
  • 清除它(至少是maven依赖部分)并发送拉取请求,以便库可以具有可接受的质量