如何将命令XX:-UseSplitVerifier添加到CRXDE Lite(CQ5.5)内置的OSGi包中?

时间:2014-03-07 19:59:43

标签: java osgi cq5 sling

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

错误 [OsgiInstallerImpl] pack.age.name [pack.age.name]实例化对象实例化时出错(java.lang.VerifyError:在方法中期望分支目标13处的堆栈图框架) pack.age.name.unbindRepo(Lorg / apache / sling / jcr / api / SlingRepository;)V偏移量为5)java.lang.VerifyError:在方法pack.age.name.unbindRepo中期望分支目标13处的stackmap帧( Lorg / apache / sling / jcr / api / SlingRepository;)V偏移量为5

据我所知,方法unbindRepo不受我的控制,所以我无法做到这一点。我看到的两个修复程序是降级到JDK1.6(我想避免)并将“XX:-UseSplitVerifier”添加到启动参数中。我已经看到各种消息来源说要将它添加到JVM启动命令中。这些资源中只有少数真正涉及到任何细节,其中没有一个能够直接在CQ环境中进行足够的细节或参考。

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

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

我是否需要使用eclipse来添加命令行参数或者是否可以使用CRXDE / Lite进行此操作?

一些澄清:当我去构建捆绑包时,它构建完美。控制台中没有错误,它在捆绑列表中显示为活动状态,组件也显示为活动状态。我不确切知道在'build bundle'生命周期中何时发生错误但是根据CQ它完全没问题但是由于某种原因它不能使用它。

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

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

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

2 个答案:

答案 0 :(得分:1)

UseSplitVerifier是JVM参数,因此必须添加到CQ启动命令行。它位于较低级别而不是OSGi包,CRX DE等。您可以在CQ启动脚本中设置它。

在Linux计算机上,文件为crx-quickstart/bin/start,在Windows上为start.bat,位于同一目录中。查找定义CQ_JVM_OPTS变量的行并在结尾添加以下参数:

-XX:-UseSplitVerifier

答案 1 :(得分:0)

我认为澄清你在这里遇到的问题非常重要,这样遇到类似事情的人就能更好地理解这个问题。

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

您收到的错误:

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;

在编译时,为该属性创建bind和unbind方法。当您为没有参数的unbind手动创建新方法时,您正在规避框架过程。长期的影响很难确定,但如果你不知道首先解开对象需要什么,那肯定不是好的做法。

要纠正您的问题,我会确认您的回购对象的签名是我所描述的,并且您没有使用类似的东西。

@Reference
private Repository repo;

如果您仍然遇到此问题,我会考虑使用此问题接近Apache Sling人员,因为它是Annotation流程的潜在问题。 另外要特别回答关于如何设置-XX的问题:-UseSplitVerifier我的回答是你不是。问题在于您创建的代码,您需要修复它,并且Oracle正在删除该参数,因此它甚至可能无法正常工作。