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 依赖部分)并发送拉取请求,以便库具有可接受的质量
我正在尝试从源代码构建 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 依赖部分)并发送拉取请求,以便库具有可接受的质量