Java Maven build-强制使用更新版本

Java Maven build-强制使用更新版本,java,maven,build,osgi,protege,Java,Maven,Build,Osgi,Protege,我正在尝试从源代码构建protege服务器。我下载了源代码。使用mvm-X包会产生以下错误: [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/webpro

我正在尝试从源代码构建protege服务器。我下载了源代码。使用mvm-X包会产生以下错误:

[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>
试图删除这一行也没有帮助,因为它出现在另一个依赖关系的下游。我无法找到如何覆盖下游导入包指令


eclipse生成的有效pom.xml作为一个链接附加:

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

以下两个由依赖项导入:

org.osgi:org.osgi.core by 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通过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或类似的地方下载冲浪插件,你会看到

注释

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

不要使用此库或 至少清除maven依赖项部分,并发送一个pull请求,以便库具有可接受的质量
为什么在systemPath中使用系统作用域而不是提供的作用域?因为我显式地提供了JAR文件,所以我根据文档使用了系统作用域:system这个作用域与提供的类似,只是您必须提供显式包含它的JAR。工件总是可用的,不会在存储库中查找。编译器使用的源和目标选项是什么?@KorMed:我知道系统作用域是什么,但我认为您不应该在本例中使用它。org.osgi.framework;version=1意味着捆绑包至少需要包org.osgi.framework的版本1.0.0。尽管osgi.core包的版本是6.0.0,但该包仍然在1.x上。捆绑包及其包的版本并不总是相同的。已尝试,但没有结果。编辑了这个问题来详细说明。我联系了开发人员:他们完全停止了这个项目的工作,这也许可以解释问题。无论如何,我可能不得不修改它。感谢您对该机制的详细解释。我将尝试你的建议。