Maven build - 强制使用较新版本

Maven build - force the use of a newer version

我正在尝试从源代码构建 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 作为 link 附加:https://docs.google.com/document/d/1eHFalUHVZ45ejLes_eqaXLw6ttjcTryphbGr_CKbhRk/edit?usp=sharing

问题是 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中,由[=32传递=]ProtegeLauncher 通过 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.core)
  • 的 4.3.1 或更高版本

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

备注

这个 protege 库的开发者显然不熟悉 maven 依赖管理的工作原理以及应该将什么作为依赖导入。该项目可传递地导入 OSGi 运行时环境,这本不应该发生。对于编译,仅应导入 API,如果目标运行时确实包含 API,则应在提供的范围内导入它。我会推荐

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