Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 沙盒或墙式类加载器将应用程序与运行时环境分离_Java_Classloader_Dynamic Class Loaders - Fatal编程技术网

Java 沙盒或墙式类加载器将应用程序与运行时环境分离

Java 沙盒或墙式类加载器将应用程序与运行时环境分离,java,classloader,dynamic-class-loaders,Java,Classloader,Dynamic Class Loaders,Tomcat的Web应用程序被包装到一个.war文件中,并抛出到Tomcat中。应用程序可以使用war文件和包含的jar文件中的类。这将Tomcat的运行时类与应用程序类分开 使用storm时(请参见storm project.net),没有类似的隔离。相反,推荐的方法需要创建一个“fatjar”,表示从各自的jar中解包后包含所有必需类文件的jar。对于简单的情况,这是可行的,但生成的fat jar必须正确合并所有合并jar中的所有META-INF/*文件,这不会半自动工作 我会毫不犹豫地编写

Tomcat的Web应用程序被包装到一个.war文件中,并抛出到Tomcat中。应用程序可以使用war文件和包含的jar文件中的类。这将Tomcat的运行时类与应用程序类分开

使用storm时(请参见storm project.net),没有类似的隔离。相反,推荐的方法需要创建一个“fatjar”,表示从各自的jar中解包后包含所有必需类文件的jar。对于简单的情况,这是可行的,但生成的fat jar必须正确合并所有合并jar中的所有META-INF/*文件,这不会半自动工作

我会毫不犹豫地编写自己的类加载器,它模拟类似于war文件的东西。除了我不知道如何拦截加载我部署的所有类的默认类加载器之外

我的理论是,我的应用程序的一个类首先由默认的类装入器装入。大概在它的静态-部分中,我会施展魔法类加载器咒语,这样所有依赖类都将由我自己的类加载器加载,现在我将如何从任何我认为合适的地方获得必要的类


对于所描述的一般问题以及所需的特定魔法的任何提示,我们都表示感谢。

拦截类加载器:默认类加载器是加载当前正在执行的类的类加载器。因此,如果您使用一个单独的类加载器来引入WAR的入口点,那么来自它或其(运行时/创建)后代的每个类引用都将默认通过该类加载器。然后,该类加载器可以使用自己的解析规则来决定应该引用更高级别的类加载器的内容,以及应该重新加载的内容——简单的规则“只向父级询问此插件中没有的内容”,也称为“父级上次”,通常已经足够了。

您的意思是,在我描述的理论中,我使用第一个类的静态部分来设置一个合适的类装入器,这已经足够了。听起来很简单。我只想知道一件事。如果在设置了新的类加载器之后,运行时环境(storm)需要更多自己的类:会先询问默认类加载器还是我的类加载器——好吧,我会考虑一下,但是如果你碰巧知道,我会感谢你的早期警告。不,我的意思是,当您的服务器实例化第一个类时,它会显式地创建新的类加载器,并使用它来获取该类。然后,该类的所有引用都将转到其默认类加载器,即您创建的类加载器。以这种方式加载的类将再次将其视为类加载器环境,依此类推,递归地沿着调用树向下。您可以说(a)“它(运行时)显式地创建了新的类加载器”,然后您可以说(b)“该类的所有引用都将转到它的默认类加载器,即您创建的类加载器。”,但是我不知道我应该把类加载器放在中间的什么地方?运行时创建新的类加载器,并显式地使用该类加载器来加载插件。插件然后将这个新类加载器视为其上下文,并要求它引用任何其他类。“运行时创建新类加载器”是个问题,因为这个类加载器不知道如何获取类。我必须修改或替换它才能做正确的事情。