所以过去几天,我在摆弄,试图在沙盒中运行jar文件。
我发现了这篇 Jens Nordahl Sandboxing plugins in Java的博客文章,我认为这是一个很好的简短示例,它对沙罐进行了沙箱测试,并且只赋予了其特定的权限。
因此,在我从模块中删除AllPermissions之前,它运行良好。
Caused by: java.lang.IllegalStateException: Resource not found in classpath: kotlin/kotlin.kotlin_builtins
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsLoaderImpl.createBuiltInPackageFragmentProvider(BuiltInsLoaderImpl.kt:55)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsLoaderImpl.createPackageFragmentProvider(BuiltInsLoaderImpl.kt:33)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.createBuiltInsModule(KotlinBuiltIns.java:127)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns.(JvmBuiltIns.kt:43)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns.(JvmBuiltIns.kt:18)
at kotlin.reflect.jvm.internal.components.RuntimeModuleData$Companion.create(RuntimeModuleData.kt:58)
at kotlin.reflect.jvm.internal.ModuleByClassLoaderKt.getOrCreateModule(moduleByClassLoader.kt:58)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:37)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:34)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data.getModuleData(KDeclarationContainerImpl.kt)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:47)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:44)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt)
at kotlin.reflect.jvm.internal.KClassImpl$Data$annotations$2.invoke(KClassImpl.kt:56)
at kotlin.reflect.jvm.internal.KClassImpl$Data$annotations$2.invoke(KClassImpl.kt:44)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getAnnotations(KClassImpl.kt)
at kotlin.reflect.jvm.internal.KClassImpl.getAnnotations(KClassImpl.kt:181)
at core.CoreClass.(CoreClass.kt:18)
at myModule.MyClass(MyClass.kt:17)
at myModule.ModuleProvider.(ModuleProvider.kt:14)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.util.ServiceLoader$ProviderImpl$2.run(ServiceLoader.java:787)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:792)
... 65 more
据我了解,这是一些预编译的东西,已加载到类路径中?
仅说明一下,我通过ServiceLoader加载了一个 ModuleProvider ,该加载器为我提供了jar中的一些类。此类在没有权限的受限类加载器下运行。然后通过反射,我尝试获取此类的一些注释。
我想这与错误信息无关(否则我很高兴为此提供一些代码)。
我知道受限类加载器的父类加载器具有此资源(因为不受限制地运行)。那么,我可以授予此受限的类加载器什么权限,以便我可以在不给类加载器太多权限且不会破坏沙箱的情况下访问此资源?
如果有另一种实现此类“罐子沙箱”的方法,我也很高兴有人获得其他建议。