作者:ym_泳梅 | 来源:互联网 | 2022-12-10 14:04
我们的项目是使用Eclipse OSGi开发的,但也提供了通过jardesc文件导出的普通JAR .该项目使用ASM库和javaagent来invokevirtual
与invokedynamic
调用交换.
这在Java 7和8中运行良好.现在,我们升级到Java 9并移植我们的实现以供使用jdk.dynalink
.
java --version`
java 9.0.4
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
出口部分
OTRE_MIN
:最小运行时和元对象协议部分.
OTRE_DYN
:动态编织代码(ASM)和运行时的其余部分.
OTRE_AGEND
:javaagent.
目前,OTRE_MIN
还包括OTRE_DYN
.所以一切都放入了bootclasspath.
我用以下代码启动程序
JVM_ARGS="-d64 -Xms1024m -Xmx4048m -ea"
MODULES="--add-reads jdk.dynalink=ALL-UNNAMED --add-reads java.base=ALL-UNNAMED"
${JAVA_HOME}bin/java $MODULES \
-Xbootclasspath/a:${OTRE_MIN} -javaagent:$OTREDYN_AGENT $JVM_ARGS \
-jar ...
但是,似乎 jdk.dynalink
在bootclasspath上不再可见包.
java.lang.NoClassDefFoundError: jdk/dynalink/linker/GuardingDynamicLinker
at org.eclipse.objectteams.otredyn.runtime.dynamic.CallinBootstrap.(CallinBootstrap.java:19)
at org.eclipse.objectteams.otredyn.bytecode.asm.CreateCallAllBindingsCallInOrgMethod.(CreateCallAllBindingsCallInOrgMethod.java:115)
at org.eclipse.objectteams.otredyn.bytecode.asm.AsmWritableBoundClass.createCallAllBindingsCallInOrgMethod(AsmWritableBoundClass.java:300)
at org.eclipse.objectteams.otredyn.bytecode.AbstractBoundClass.weaveBindingInImplementedMethod(AbstractBoundClass.java:1180)
at org.eclipse.objectteams.otredyn.bytecode.AbstractBoundClass.handleTaskList(AbstractBoundClass.java:741)
at org.eclipse.objectteams.otredyn.bytecode.AbstractBoundClass.transformAtLoadTime(AbstractBoundClass.java:383)
at org.eclipse.objectteams.otredyn.transformer.jplis.ObjectTeamsTransformer.transform(ObjectTeamsTransformer.java:120)
at org.eclipse.objectteams.otredyn.transformer.jplis.ObjectTeamsTransformer.transform(ObjectTeamsTransformer.java:72)
at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:550)
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1007)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:801)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:699)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:622)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at BankBenchmark2.setUp(BankBenchmark2.java:32)
at Run.doRuns(Run.java:55)
at Run.runBenchmark(Run.java:29)
at Harness.main(Harness.java:34)
我阅读了有关Java 9和模块系统的其他线程以及类加载器的更改,但它们没有提供任何解决方案.
如何使Java 9之前jdk.dynalink
的类可见$OTRE_MIN
?