【问题标题】:Apache Karaf startup ArrayIndexOutOfBoundsException: 19Apache Karaf 启动 ArrayIndexOutOfBoundsException: 19
【发布时间】:2019-09-05 15:36:46
【问题描述】:

前言

我正在使用 Karaf 部署一些 Camel 路线。 我目前正在为此使用部署文件夹。我的问题是 Karaf 第一次使用部署文件夹中的内容启动需要很长时间,我将在稍后列出。没有这些内容,启动是相当快的。在随后的启动中,错误不会出现。我通过 karaf.sh 启动 Karaf 并启用调试。

版本

  • JDK:采用OpenJdk/OpenJDK8
  • 卡拉夫版本:4.2.6
  • 骆驼版:3.0.0-M1
  • 我的 bean 的目标:Java 1.8

配置

我正在使用这些文件进行配置。

org.apache.karaf.features.cfg:

featuresRepositories = \
    mvn:org.apache.karaf.features/standard/4.2.6/xml/features, \
    mvn:org.apache.karaf.features/framework/4.2.6/xml/features, \
    mvn:org.apache.karaf.features/enterprise/4.2.6/xml/features, \
    mvn:org.apache.karaf.features/spring/4.2.6/xml/features, \
    mvn:org.apache.camel.karaf/apache-camel/3.0.0-M1/xml/features, \
    mvn:org.apache.activemq/activemq-karaf/5.15.9/xml/features

featuresBoot = \
    (wrap)/2.6.1, \
    instance/4.2.6, \
    package/4.2.6, \
    log/4.2.6, \
    ssh/4.2.6, \
    framework/4.2.6, \
    system/4.2.6, \
    eventadmin/4.2.6, \
    feature/4.2.6, \
    shell/4.2.6, \
    management/4.2.6, \
    service/4.2.6, \
    jaas/4.2.6, \
    deployer/4.2.6, \
    diagnostic/4.2.6, \
    bundle/4.2.6, \
    config/4.2.6, \
    kar/4.2.6, \
    http-whiteboard/4.2.6, \
    http/4.2.6, \
    war/4.2.6 , \
    camel/3.0.0-M1, \
    camel-core/3.0.0-M1, \
    camel-groovy/3.0.0-M1, \
    camel-jackson/3.0.0-M1, \
    camel-jms/3.0.0-M1, \
    camel-jsonpath/3.0.0-M1, \
    camel-jetty9/3.0.0-M1, \
    camel-rest-swagger/3.0.0-M1, \
    camel-swagger-java/3.0.0-M1, \
    camel-http4/3.0.0-M1, \
    camel-mongodb3/3.0.0-M1, \
    camel-netty4/3.0.0-M1, \
    activemq-broker/5.15.9

org.apache.karaf.features.xml:

<blacklistedRepositories>
        <repository>mvn:org.apache.karaf.features/framework/4.3.0-SNAPSHOT/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/standard/4.3.0-SNAPSHOT/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/standard/4.2.1-SNAPSHOT/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/standard/4.2.1/xml/features</repository>
        <repository>mvn:org.ops4j.pax.web/pax-web-features/7.2.3/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/enterprise/4.3.0-SNAPSHOT/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/enterprise-legacy/4.3.0-SNAPSHOT/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/spring/4.3.0-SNAPSHOT/xml/features</repository>
        <repository>mvn:org.apache.karaf.features/spring-legacy/4.3.0-SNAPSHOT/xml/features</repository>
</blacklistedRepositories>

我的部署文件夹目前有以下内容:

  • 带有骆驼豆的 JAR 文件 (23KB)
  • 一个 KAR 文件及其依赖项 (2.7MB)
  • 我使用上述骆驼豆的蓝图文件 (15KB)

当我尝试启动 Karaf 时,我也收到此错误,这实际上是在第一次之后出现的第二次:

java.lang.ArrayIndexOutOfBoundsException: 19
     at aQute.bnd.osgi.Clazz.parseClassFile(Clazz.java:576)
     at aQute.bnd.osgi.Clazz.parseClassFile(Clazz.java:494)
     at aQute.bnd.osgi.Clazz.parseClassFileWithCollector(Clazz.java:483)
     at aQute.bnd.osgi.Clazz.parseClassFile(Clazz.java:473)
     at aQute.bnd.osgi.Analyzer.analyzeJar(Analyzer.java:2177)
     at aQute.bnd.osgi.Analyzer.analyzeBundleClasspath(Analyzer.java:2083)
     at aQute.bnd.osgi.Analyzer.analyze(Analyzer.java:138)
     at aQute.bnd.osgi.Analyzer.calcManifest(Analyzer.java:616)
     at org.ops4j.pax.swissbox.bnd.BndUtils.createBundle(BndUtils.java:161)
     at org.ops4j.pax.url.wrap.internal.Connection.getInputStream(Connection.java:83)
     at java.net.URL.openStream(URL.java:1057)
     at org.apache.karaf.features.internal.download.impl.SimpleDownloadTask.download(SimpleDownloadTask.java:77)
     at org.apache.karaf.features.internal.download.impl.AbstractRetryableDownloadTask.run(AbstractRetryableDownloadTask.java:60)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
     at java.lang.Thread.run(Thread.java:748)

到目前为止我做了什么

  • 重新安装 Karaf
  • 我升级到了这个版本的 Karaf
  • 我尝试安装 OpenJDK9, 11
  • 我分析了我的传递依赖,发现其中一些针对 Java 1.9

错误仍然存​​在。 Karaf 和我的骆驼路线在 Karaf 启动后正常工作,我只是不喜欢看到这个错误。我的骆驼应用程序以 1.9 为目标是否有意义?升级将是一个巨大的过程,也许您可​​以从我在请求目标 1.9 之前提供的内容中看到一些东西。

【问题讨论】:

    标签: java xml apache-camel apache-karaf


    【解决方案1】:

    很可能尝试安装一个(或多个)jar 文件,它是 Java 9+ 模块而不是 OSGi 包。在这种情况下,Karaf 尝试使用wrap it 动态地制作一个捆绑包。包装逻辑使用bnd 分析jar 文件。它可能取决于旧版本的 bnd 失败,因为它无法解析 Java 9+ 类(很可能是新引入的 module-info.class)。

    要查找已打包的包,您可以在 Karaf 中运行 bundle:list -t 0 -u | grep "wrap:" 命令。

    解决问题的一些方法是:

    • 不要包装 Java 9+ 模块。使用旧版本的库
    • wrap the module(s) manually 使用最新的 bnd 部署之前
    • 联系 OPS4J Pax URL 团队并询问是否有更新的版本可以包装 Java 9+ 模块(可能取决于更新的bnd 版本)

    更新:

    看起来 Apache Karaf 社区正在 https://issues.apache.org/jira/browse/KARAF-6988 中修复此问题。所以你应该可以通过升级到 JIRA 中提到的 Karaf 版本来解决它。

    【讨论】:

    • 对我的疑问最有帮助的答案。如果在 karaf 的任何包中找到解析逻辑,那么我们可以更新该包以解决此问题。我发现该类位于“org.ops4j.pax.web”依赖项中,但我找不到哪个依赖项将进入karaf。您对此有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多