问题标签 [classloader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何将 JDK6 ToolProvider 和 JavaCompiler 与上下文类加载器一起使用?
我的用例是使用 JDK 6 中提供的 ToolProvider 和 JavaCompiler 类从 java 程序编译生成的源文件。源文件包含对上下文类加载器中类的引用(它在 J2EE 容器中运行),但不在系统类加载器中。我的理解是,默认情况下 ToolProvider 将使用系统类加载器创建 JavaCompiler 实例。
有没有办法指定一个类加载器供 JavaCompiler 使用?
我尝试了这种方法,根据 IBM DeveloperWorks 上的某些内容进行了修改:
FileManagerImpl 定义为:
堆栈跟踪表明它在注释处理期间仅被调用一次。我验证了要编译的源文件中引用的类不在系统类路径上,但可以从上下文类加载器中获得。
java - Problems in ClassLoaders for Long running Tomcat process
We have hosted our web applications on Tomcat 6.0.18 and experienced the following problem:
There are two web apps WebApp1 and WebApp2, both are same system but of different versions.
Now the problem is when the tomcat has been running for a week or longer time then sometimes system gives NoClassDefFoundError ! also we got some strange issue where the Class Loader of WebApp1 has loaded the class present in the jar of WebApp2 ! The same jar is also present in WebApp1 but the versions are different.
When we restarted the Tomcat everything started working fine ! Our JRE is 1.5.10
Please let me know if you have encountered such issues.
Regards, Jatan Porecha
java - 在Java中访问没有顶级类的非顶级类
我有一个 Java 文件TestThis.java
,如下所示:
上面的代码文件编译良好,没有任何警告/错误。有什么方法可以访问任何课程A
或B
没有任何其他外部课程的顶级课程?
如果不是,那么为什么 Java 甚至允许在没有顶级类的情况下编译此类文件?
java - 覆盖应用程序服务器行为以在打包的 Web 应用程序中加载 jsp-api 和 servlet-api jar
我有一个使用特定版本的 jsp-api 和 servlet-api jar 文件构建和打包的项目。现在我希望在任何应用程序服务器(例如 tomcat、WAS、Weblogic 等)上部署 Web 项目时加载这些 jar。
我在 tomcat 上看到的行为是它给出的消息是这些 api 的打包版本没有与有问题的类一起加载。
有什么办法可以覆盖这些服务器设置或行为?
我担心的是,让服务器的默认行为可能会允许不同服务器上的不同行为,甚至是同一应用服务器的不同版本。
java - 动态加载具有非默认包且没有嵌套文件夹的类文件
我正在为刚接触 Java 的学生编写一个课程项目。它具有这样的文件夹结构。
我明白了,所以 jar 可以加载 Solutions/my/really/long/package/ 目录中的所有类。通过将“解决方案/”添加到类路径。
我的问题是是否可以设置它,以便在不使用默认包的情况下不存在用于包的长嵌套文件夹。
由此产生的结构将是
但是 MySolution 类没有默认包。
java - 在正在运行的 JVM 中查找正在运行的实例
我想知道是否可以处理给定类的运行实例。触发此问题的特定问题是由于许多正在运行的线程而无法正常退出的应用程序。
是的,我知道您可以对theads 进行守护,这样它们就不会阻止应用程序退出。但这确实让我想知道这是否可能。我能做的最接近的事情是类加载器(受保护!)findLoadedClass,尽管您必须运行自己的类加载器才能做到这一点。
在相关的说明中,这是分析工具如何管理跟踪对象句柄的吗?通过运行他们自己的自定义类加载器?还是有一些我没有看到的好方法?
java - 在 Java 中,Class.forName 可以返回 null 吗?
在 Java 中,Class.forName 是否可以返回 null,或者如果找不到该类,它是否总是抛出 ClassNotFoundException 或 NoClassDefFoundError?
java - 在Java中,是否可以知道一个类是否已经被加载?
是否可以在不尝试加载的情况下知道是否已加载 Java 类?Class.forName
尝试加载类,但我不想要这种副作用。还有其他方法吗?
(我不想重写类加载器。我正在寻找一个相对简单的方法。)
java - 我自己的类加载器?
这是我遇到的问题。有一个巨大的遗留应用程序在 java 1.3 上运行并使用外部 API,例如 MyAPI v1.0。MyAPI 1.0 的确切实现位于应用程序使用的类路径中的某个位置。还有一种机制允许该应用程序使用外部代码(某种插件机制)。现在我有另一个使用 MyAPI v2.0(与 v1.0 不是 100% 向后兼容)的 java 库 (MyLib.jar),我必须使用该插件机制从原始应用程序中使用它。所以我必须以某种方式让同一个 API 的两个(不兼容!)版本一起工作。具体来说,我想在从 MyLib.jar 类调用 API 类时使用 MyAPI v2.0,而在所有其他情况下使用 MyAPI 1.0。
MyAPI 1.0 在类路径中,所以默认使用它,没关系。我可以创建自己的类加载器版本来从 MyAPI 2.0 加载类 - 没问题。但是我如何将它们组合在一起呢?问题:
MyLib.jar 对象从 MyAPI 2.0 实例化了很多(!)类的实例。这是否意味着我必须通过反射来完成所有这些实例化(指定我自己的类加载器)?这真是一个地狱般的工作!
如果某些 MyAPI 2.0 对象被实例化并且它在内部从 MyAPI 实例化另一个对象,它将使用什么类加载器?它会使用我的类加载器还是默认的类加载器?
总的来说,我的方法听起来合理吗?有没有更好的办法?
java - 为什么 Java 类加载在 Linux 上会失败,但在 Windows 上会成功?
我有一个使用 Jetty 部署的 Java Web 应用程序(使用 Spring)。如果我尝试在 Windows 机器上运行它,一切都按预期工作,但如果我尝试在我的 Linux 机器上运行相同的代码,它会失败,如下所示:
我已经使用 运行了该应用程序java -verbose:class
,根据该输出,org.apache.log4j.Category 是从我的 /WEB-INF/lib 中的 log4j JAR 加载的,就在引发第一个异常之前。
现在,两台机器上的 Java 版本略有不同。两台机器都有 Sun 的 java,Linux 机器有 1.6.0_10,而 Windows 机器有 1.6.0_08,或者可能是 07 或 06,我现在不记得确切的数字,并且手头没有机器. 但即使 Java 的次要版本略有不同,代码也不应该像这样中断。有谁明白这里有什么问题?