【问题标题】:How do I add the command XX:-UseSplitVerifier to an OSGi bundle built in CRXDE Lite (CQ5.5)?如何将命令 XX:-UseSplitVerifier 添加到内置于 CRXDE Lite (CQ5.5) 中的 OSGi 包?
【发布时间】:2014-03-07 19:59:42
【问题描述】:

我正在尝试在 CQ5.5 中创建自定义 WCMCommand。我有 JDK1.7 并且遇到了可怕的 VerifyError。

ERROR [OsgiInstallerImpl] pack.age.name [pack.age.name] 实现对象实例化期间出错(java.lang.VerifyError: Expecting a stackmap frame at branch target 13 in method package.age.name.unbindRepo(Lorg/apache/sling/jcr/api/SlingRepository;)V at offset 5) java.lang.VerifyError: Expecting a stackmap frame at branch target 13 in method pack.age.name.unbindRepo( Lorg/apache/sling/jcr/api/SlingRepository;)V 在偏移量 5

据我所知,unbindRepo 方法超出了我的控制范围,因此我对此无能为力。我看到的两个修复是降级到 JDK1.6(我想避免)和添加“XX:-UseSplitVerifier 到启动参数”。我已经看到各种消息来源说要将其添加到 JVM 启动命令中。这些资源中只有少数真正涉及任何细节,而且没有一个提供足够的细节或直接在 CQ 环境中进行参考。

那么,如何将其作为启动参数直接添加到 CQ 之外的 JVM 中,或者如何将其添加到 CQ 中的 Build Bundle Process 中?我希望如果我可以构建带有触发此标志的捆绑包,那么捆绑包将能够正确构建。

据我所知,大多数 JVM 命令都是从命令行使用的,而在 CQ 中构建包时似乎没有等效的过程。

我是否需要使用 eclipse 来添加命令行参数,或者是否可以使用 CRXDE /Lite 来完成?

一些澄清:当我去构建捆绑包时,它构建得非常好。控制台中没有错误,它在捆绑列表中显示为活动的,并且组件也显示为活动的。我不完全知道在“构建捆绑包”生命周期中何时发生错误,但根据 CQ,它非常好,但由于某种原因它不能使用它。

编辑:我“技术上”解决了这个问题。正如您在上面看到的那样,函数“unbindRepo”正在引发错误。所以尽管不知道它应该做什么,但我添加了

public void unbindRepo(SlingRepository repo)
{
  //  doNothing();
}

它停止抛出错误,现在一切都可以继续了。我不推荐它作为解决方案,但它至少让我现在继续前进,这正是我想要的。由于我的问题是以 Tomek 确实回答了我的实际问题的方式措辞的,因此接受他的答案仍然是合适的。

【问题讨论】:

  • 澄清一下,您正在创建一个 OSGi 捆绑包并且该捆绑包抛出此错误对吗?这不是现有代码库中出现的标准错误。
  • 正确,我认为。我实际上是“技术上”自己修复的。我从字面上删除了一个“unbindRepo”函数,它停止了抱怨。公共无效 unbindRepo(){doNothing();}。它至少让我继续前进。在我了解得更清楚之前,我不确定这是一个“好的解决方案”。

标签: java osgi aem sling


【解决方案1】:

UseSplitVerifier 是一个 JVM 参数,因此必须添加到 CQ 启动命令行中。它比 OSGi 包、CRX DE 等低级。您可以在 CQ 启动脚本中设置它。

在 Linux 机器上,该文件是 crx-quickstart/bin/start,而在 Windows 上,它是同一目录中的 start.bat。查找定义CQ_JVM_OPTS 变量的行并在末尾添加以下参数:

-XX:-UseSplitVerifier

【讨论】:

  • 该行没有引号。我需要添加它们吗?设置 CQ_JVM_OPTS=-Xmx1024m -XX:MaxPermSize=256M -Djava.awt.headless=true -XX:-UseSplitVerifier 就是这样
  • 谢谢。不幸的是,这并没有解决我的问题。但你确实回答了我的问题。
【解决方案2】:

我认为澄清您在这里遇到的问题很重要,这样遇到类似情况的人将能够更好地理解该问题。

总而言之,您创建了一个自定义 osgi 包,其中包含基于 WCMCommand 的新服务

您收到的错误:

java.lang.VerifyError: Expecting a stackmap frame at branch target 13 in method
pack.age.name.unbindRepo(Lorg/apache/sling/jcr/api/SlingRepository;)V

是说当 Java 7 尝试验证您的方法的签名时。它遇到错误。这只发生在 Java7 中,因为 Oracle 提高了发生的验证级别。发生的错误在方法签名中:

unbindRepo(SlingRepository repo);

如果您查看您的 java 类,您会注意到该方法不存在。它不存在的原因是它是在您使用 Apache Sling @Reference 注释时为您创建的。因此,您的代码中有一个很好的变化,您有以下行。

@Reference
private SlingRepository repo;

它在编译时为该属性创建绑定和取消绑定方法。当您为不带参数的 unbind 手动创建新方法时,您正在绕过框架过程。从长远来看会产生什么影响很难确定,但如果您不知道首先解除绑定对象需要什么,那肯定不是好的做法。

为了纠正你的问题,我会确认你有一个 repo 对象的签名,正如我所描述的那样,并且你没有使用类似的东西。

@Reference
private Repository repo;

如果您仍然对此有疑问,我会考虑就这个问题与 Apache Sling 人员联系,因为这是注释过程的潜在问题。 此外,要专门回答您有关如何设置 -XX:-UseSplitVerifier 的问题,我的回答是您没有。问题出在您创建的代码中,您需要修复它,而 Oracle 正在删除该参数,因此它甚至可能无法正常工作。

【讨论】:

  • 那么我想要哪一个?存储库还是 SlingRepository?我有 SlingRepository,但我只是注意到它不是公共或私有的,这可能是问题所在。
  • 应该是 SlingRepository。我认为变量的范围不是问题,但值得一试。我还会检查以确保您没有在课堂上的其他地方重用属性名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2018-09-09
  • 1970-01-01
  • 2012-10-30
  • 2021-01-12
  • 2013-07-22
  • 2012-03-04
相关资源
最近更新 更多