【问题标题】:Using OSGi and Apache Felix iPOJO with JDK 11在 JDK 11 中使用 OSGi 和 Apache Felix iPOJO
【发布时间】:2019-04-15 11:51:36
【问题描述】:

我有一个围绕 OSGi 和 iPOJO 构建的项目,我正在尝试确定它是否仍可与 JDK 11 一起使用。它目前正在使用 JDK 8。自从最新版本的 iPOJO (1.12. 1)于2014年发布。更新目标和maven编译器版本后,我遇到了以下问题:

[ERROR] Failed to execute goal org.apache.felix:maven-ipojo-plugin:1.12.1:ipojo-bundle (default) on project redacted: Execution default of goal org.apache.felix:maven-ipojo-plugin:1.12.1:ipojo-bundle failed. IllegalArgumentException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.felix:maven-ipojo-plugin:1.12.1:ipojo-bundle (default) on project redacted: Execution default of goal org.apache.felix:maven-ipojo-plugin:1.12.1:ipojo-bundle failed.
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default of goal org.apache.felix:maven-ipojo-plugin:1.12.1:ipojo-bundle failed.
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:145)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
        ... 20 more
Caused by: java.lang.IllegalArgumentException
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.objectweb.asm.ClassReader.<init>(Unknown Source)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.model.parser.AnnotationParser.read(AnnotationParser.java:32)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.registry.MetaAnnotationBindingRegistry.createBindings(MetaAnnotationBindingRegistry.java:94)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.registry.CompletableBindingRegistry.getBindings(CompletableBindingRegistry.java:45)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.registry.CompletableBindingRegistry.getBindings(CompletableBindingRegistry.java:43)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.registry.CompletableBindingRegistry.getBindings(CompletableBindingRegistry.java:43)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Selection.list(Selection.java:129)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Selection.get(Selection.java:98)
        at org.apache.felix.ipojo.manipulator.metadata.annotation.MethodMetadataCollector.visitAnnotation(MethodMetadataCollector.java:69)
        at org.objectweb.asm.ClassReader.b(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at org.apache.felix.ipojo.manipulator.metadata.AnnotationMetadataProvider.computeAnnotations(AnnotationMetadataProvider.java:111)
        at org.apache.felix.ipojo.manipulator.metadata.AnnotationMetadataProvider.access$200(AnnotationMetadataProvider.java:44)
        at org.apache.felix.ipojo.manipulator.metadata.AnnotationMetadataProvider$1.visit(AnnotationMetadataProvider.java:90)
        at org.apache.felix.ipojo.manipulator.store.JarFileResourceStore.accept(JarFileResourceStore.java:161)
        at org.apache.felix.ipojo.manipulator.metadata.AnnotationMetadataProvider.getMetadatas(AnnotationMetadataProvider.java:75)
        at org.apache.felix.ipojo.manipulator.metadata.CompositeMetadataProvider.getMetadatas(CompositeMetadataProvider.java:53)
        at org.apache.felix.ipojo.manipulator.Pojoization.pojoization(Pojoization.java:360)
        at org.apache.felix.ipojo.manipulator.Pojoization.pojoization(Pojoization.java:243)
        at org.apache.felix.ipojo.plugin.ManipulatorMojo.execute(ManipulatorMojo.java:265)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
        ... 21 more

粗略一瞥,maven-ipojo-plugin 的 asm 依赖似乎与 JDK 11 有问题,这是有道理的,因为 iPOJO 对 asm 5.0.4 具有传递依赖,而 JDK 11 支持则没有添加到 asm 7.0。我试图排除传递依赖并添加 asm 7.0 作为依赖,但我仍然得到同样的错误。

感谢您的关注,如果有任何其他想法或见解,我将不胜感激。

【问题讨论】:

  • 插件必须使用 JDK 11 的 asm 库(类文件格式已更改)。很可能,它需要更新插件,但在某些情况下,它有助于直接在插件中指定 asm 的版本。在 pom.xml 中 'maven-ipojo-plugi' 的 'plugin' 元素内,您可以指定 'dependencies'->'dependency' 。依赖有groupId:org.ow2.asm, artifactId:asm, version:7.0
  • 感谢您这样做!指定 so 将错误更改为:Execution default of goal org.apache.felix:maven-ipojo-plugin:1.12.1:ipojo-bundle failed: This feature requires ASM7 这很奇怪,因为我试图要求 asm 7。关于那个有什么想法吗?
  • 表示插件必须更新。我已经看到了 maven-shade-plugin 和 maven-plugin-plugin 的相同问题。抱歉,如果该插件未维护,您必须考虑 ipojo-plugin 的替代方案才能迁移到 Java 11。
  • 那太糟糕了。这就是我害怕的。感谢您的观看!
  • @gjoranv 你能发布你的回复作为答案吗?我会接受它以保护未来的谷歌人的这个答案。

标签: java maven osgi apache-felix ipojo


【解决方案1】:

在 maven 构建期间来自 ASMIllegalArgumentException 表明插件使用的 ASM 库版本对于当前的 Java 字节码来说太旧了。 Java 11 字节码需要 ASM 7(正如你提到的),它在几周前才以稳定版本发布。

当从 JDK 9 迁移到 10 时,可以通过明确声明 ASM 6.2 作为对例如的依赖项来解决此问题。 maven-shade-plugin:

     <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.1</version>
        <dependencies>
            <!-- TODO: Remove for shade-plugin 3.1.2 - https://issues.apache.org/jira/browse/MSHADE-289 -->
            <dependency>
                <groupId>org.ow2.asm</groupId>
                <artifactId>asm</artifactId>
                <version>6.2</version>
            </dependency>
        </dependencies>
    </plugin>

这个技巧不适用于 JDK 11,它需要插件本身的更新,例如maven-shade-pluginmaven-plugin-plugin。正如您的努力所示,maven-ipojo-plugin 也是如此。如果未维护该插件,您可能应该考虑 ipojo-plugin 的替代方案,以便迁移到 Java 11。

您可以尝试将maven-compiler-plugintarget 版本设置为1.8,这应该具有类文件将与ipojo-plugin 兼容的效果。但是您可能还必须将 source 版本设置为 1.8,并且将无法使用任何 Java 9+ 语言功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多