我们的项目是使用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)
Run Code Online (Sandbox Code Playgroud)
出口部分
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 ...
Run Code Online (Sandbox Code Playgroud)
但是,似乎 jdk.dynalink在bootclasspath上不再可见包.
java.lang.NoClassDefFoundError: jdk/dynalink/linker/GuardingDynamicLinker
at org.eclipse.objectteams.otredyn.runtime.dynamic.CallinBootstrap.<clinit>(CallinBootstrap.java:19)
at org.eclipse.objectteams.otredyn.bytecode.asm.CreateCallAllBindingsCallInOrgMethod.<clinit>(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) …Run Code Online (Sandbox Code Playgroud) 在我在java 8上运行的应用程序中,我-bootclasspath:p用来向引导类路径添加一个jar.在java 9中,该选项被删除.在java 9中做同样的事情的替代方法是什么?
我有一个读取系统属性的类加载器应用程序 sun.boot.class.path
但是我在 JDK 9 的发行说明中发现此属性已被删除。
System.getProperty("sun.boot.class.path"); // In JDK 9/10 this returns null
Run Code Online (Sandbox Code Playgroud)
但是我还是想在JDK 10中检索这个属性值,怎么做呢?
我期待如下值:
/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jfr.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/classes
Run Code Online (Sandbox Code Playgroud)
供参考:
我不想使用该-Xbootclasspath选项。只需要路径值。
我想替换我的Eclipse插件所依赖的一些类(javax.tools.*)rt.jar依赖于我自己的这些类的版本.rt.jar通常通过设置bootclasspath来替换类.我的问题是如何在Eclipse插件中执行此操作.
我创建了这些类的版本的JAR文件,并将其添加到Bundle-ClassPath的属性MANIFEST.MF,该bin.includes属性build.properties,和.classpath.我还将我的JAR文件的路径输入到Eclipse Application启动配置对话框的名为"Bootstrap entries:"的字段中,并将我的JAR移动到"Project Properties> Build Path"的"Order and Export"选项卡中的顶部.尽管如此,当我使用Eclipse Application启动配置运行Eclipse插件时,插件使用原始类rt.jar而不是我的JAR文件中的类.
我如何配置我的Eclipse插件,以便它首先查找我的JAR文件中的类,并且rt.jar仅在我的JAR文件中找不到该类时才进行咨询?
这个问题与另一个问题有关.我重新编译了Android框架并生成了一个新图像.我需要在原始框架中添加一些类,并通过添加进入/ system/framework的新jar来实现.我修改了BOOTCLASSPATH以考虑这些新罐子.
构建映像并闪烁到设备不起作用.必须在此之前运行一些优化,但我不知道该过程是如何进行的.
在生成映像之前我应该执行哪些构建步骤,或者我有什么其他替代方法,以便可以从应用程序访问扩展框架类?
我知道有一个“引导类加载器”从 jre/lib(rt.jar 等)加载所有类。是否有可能让我使用这个“引导类加载器”以便从另一个非 java 包加载额外的类?
我说的是引导程序类路径,它与此答案中描述的常规类路径非常不同:我应该如何在运行时动态加载 Jars?
classpath ×5
java ×5
java-9 ×2
android ×1
build ×1
classloader ×1
eclipse ×1
firmware ×1
java-module ×1
module ×1