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

Java 如何将命令XX:-UseSplitVerifier添加到CRXDE Lite(CQ5.5)中内置的OSGi包中?,java,osgi,aem,sling,Java,Osgi,Aem,Sling,我正在尝试在CQ5.5中创建自定义WCMCommand。我有JDK1.7,我得到了可怕的验证错误 实例化实现对象时出现错误[OsgiInstallerImpl]pack.age.name[pack.age.name]错误(java.lang.VerifyError:在方法pack.age.name.unbindRepo的分支目标13处需要stackmap框架(Lorg/apache/sling/jcr/api/SlingRepository;)V偏移量5处)java.lang.VerifyErr

我正在尝试在CQ5.5中创建自定义WCMCommand。我有JDK1.7,我得到了可怕的验证错误

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

据我所知,解除债券回购的方法是我无法控制的,因此在这方面我无能为力。我看到的两个修复是降级到JDK1.6(我希望避免),并在启动参数中添加“XX:-UseSplitVerifier”。我看到各种来源都说要将它添加到JVM启动命令中。这些资源中只有少数真正深入到任何细节中,没有一个能够在CQ环境中直接深入到足够的细节或引用

那么,如何将其作为启动参数直接添加到CQ之外的JVM中,或者如何将其添加到CQ内的构建包过程中?我希望如果我能用这个标志来构建捆绑包,那么捆绑包将能够正确构建

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

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

一些澄清:当我构建包时,它构建得非常好。控制台中没有错误,它在捆绑包列表中显示为活动,组件也显示为活动。我不知道在“build bundle”生命周期中什么时候会发生错误,但根据CQ的说法,这很好,但出于某种原因,它无法使用它

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

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

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

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

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

-XX:-UseSplitVerifier

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

总之,您使用基于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
是指当Java7试图验证方法的签名时。它遇到了一个错误。这只发生在Java7中,因为Oracle提高了验证级别。发生的错误在方法签名中:

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

@Reference
private SlingRepository repo;
它在编译时为该属性创建绑定和取消绑定方法。当您为无参数的unbind手动创建新方法时,您是在规避frameworks过程。从长远来看,这会产生什么样的影响很难确定,但如果您不知道首先需要解除对象的绑定,这肯定不是好的做法

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

@Reference
private Repository repo;

如果你继续对此有问题,我会考虑用这个问题来接近Apache SLink人,因为这是注释过程中的一个潜在问题。


另外,为了明确回答您关于如何设置-XX:-UseSplitVerifier的问题,我的回答是您不需要。问题出在您创建的代码中,您需要修复该问题,Oracle正在删除该参数,因此该参数可能无法正常工作。

该行中没有引号。我需要添加它们吗?设置CQ\u JVM\u OPTS=-Xmx1024m-XX:MaxPermSize=256M-Djava.awt.headless=true-XX:-UseSplitVerifier就是这些,谢谢。不幸的是,这并没有解决我的问题。但您确实回答了我的问题。为了澄清,您正在创建一个OSGi捆绑包,而该捆绑包抛出的错误是否正确?这不是发生在现有代码库中的标准错误。我认为是正确的。实际上,我自己“技术上”修复了它。我真的删掉了一个“unbindRepo”函数,它不再抱怨了。public void unbindRepo(){doNothing();}。这至少让我可以继续前进。我不确定这是否是一个“好的解决方案”,直到我更清楚。那么,我想要哪一个呢?存储库还是SlingRepository?我有SlingRepository,但我只是注意到它不是公共的或私有的,这可能是问题所在。它应该是SlingRepository。我不认为变量的范围是个问题,但值得一试。我还要检查以确保您没有将类中的其他地方的属性名用于其他用途。