【问题标题】:How to set my custom class loader to be the default?如何将我的自定义类加载器设置为默认值?
【发布时间】:2010-09-27 07:03:16
【问题描述】:

我正在尝试使用自定义类加载器来练习自己,但我有一些问题。有没有办法指示 JVM 全局使用我的自定义类加载器?比如我写了一个在Tomcat 6下运行的小应用。servlet是由容器管理的,我的类加载器应该在哪里设置呢?另外,webapp 使用了一些 3rd 方 jar,我可以控制这些 jar 的类加载吗?

在独立应用的情况下,上述答案是否会有所不同?

谢谢!

【问题讨论】:

    标签: java tomcat classloader


    【解决方案1】:

    您可以将系统默认类加载器设置为 JVM 参数:

    java -Djava.system.class.loader
        =com.test.YourCustomClassLoader com.test.YourMainClass
    

    由于 Tomcat 作为 java 应用程序启动,您也可以在 %TOMCAT_HOME%\bin\run.bat$TOMCAT_HOME/bin/run.sh 可执行文件中设置此参数。

    编辑完成: 如果您将类加载器设置为 de System 类加载器,它将用于加载 Tomcat 组件类、不同的库和您自己的类。 如果您希望您的类加载器仅用于您的应用程序类(包括库等),您应该为您的上下文配置一个Loader 元素。 Loader 元素必须在Context 元素中定义,可以在context.xml 文件中定义。 更多信息:

    【讨论】:

    • 由于某种原因它让我 java.lang.Error: java.lang.IllegalStateException: recursive invocation。这就是我所做的:继承 ClassLoader,提供以 ClassLoader 作为参数的 c'tor,使用 -Djava.system.class.loader 对其进行配置,然后......砰!初始化 VM 时发生错误 :-( 我错过了什么吗?
    • 我已经用我拥有的一个小主应用程序对其进行了测试,它运行正常。
    • 包 com.demo.presale; public class MyClassLoader extends ClassLoader { public MyClassLoader( ClassLoader parent ) { } protected Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { Class c = super.loadClass( name, resolve ); System.out.println("名称:"+名称+",类:"+c);返回 c; } }
    • 还有异常:java.lang.IllegalStateException:在 java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1312) 在 java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1295) 的递归调用在 java.lang.ClassLoader.(ClassLoader.java:228) 在 com.demo.presale.MyClassLoader.(MyClassLoader.java:7) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)跨度>
    • 在我的测试代码中,被覆盖的构造函数调用父类构造函数。它检查一些权限,并将“初始化”属性设置为 true。我还覆盖了默认构造函数,也调用了父构造函数:package com.test;公共类 MyCustomClassLoader 扩展 ClassLoader { public MyCustomClassLoader() { super(); } public MyCustomClassLoader(ClassLoader parent) { super(parent); } /* 其余的代码和你的完全一样 */ }
    猜你喜欢
    • 2014-06-09
    • 2021-08-22
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多