Tag: classloader

WAS 6.1 java.lang.VerifyError:违反了类加载约束

Linux上的环境是WAS 6.1,部署了一个使用xercesImpl.jar类的webapp。 由于公司政策限制,必须使用以下设置部署应用: Class Loader Order Classes loaded with parent class loader first -> Classes loaded with application class loader first WAR class loader policy Class loader for each WAR file in application -> Single class loader for application WAR文件包含xercesImpl.jar的副本,与编译应用程序时类路径中的相同。 在启动webapp时,当Spring尝试解析其配置时,它会抛出: java.lang.VerifyError: class loading constraint violated (class: org/apache/xerces/jaxp/DocumentBuilderImpl method: parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;) 因此分析 看来WAS提供了org.apache.xerces.jaxp.DocumentBuilderImpl的实现,因为我们可以从WAR文件中删除xercesImpl.jar并仍然得到相同的错误(不是ClassNotFoundException)。 因此,WAS似乎使用自己的副本解析引用,该副本与我们编译的类文件中的引用不兼容。 但是,我可以找到的’xercesImpl.jar’的唯一其他实例(除了使用我们的应用程序部署的副本)位于目录deploytool ,它似乎位于应用服务器之外。 […]

使用JavaCompiler和ClassLoader编译和运行用户代码

我正在为java学习编写web应用程序。 使用哪些用户可以在我的服务器上编译他们的代码+运行该代码。 使用JavaCompiler进行编译很容易: JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector diagnostics = new DiagnosticCollector(); CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, prepareFile(nazwa, content)); task.call(); List returnErrors = new ArrayList(); String tmp = new String(); for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { tmp = String.valueOf(diagnostic.getLineNumber()); tmp += ” msg: ” + diagnostic.getMessage(null); returnErrors.add(tmp.replaceAll(“\n”, ” “)); } 我设法用代码加载类: JavaCompiler […]

如何在Java中更改默认类加载器?

假设我有三个类,example.ClassA,example.ClassB和example.ClassLoader。 ClassA打印出HelloWorld,ClassB导入example.ClassA并调用其main()方法。 如果我这样做: java -cp Example.jar -Djava.system.class.loader = example.ClassLoader example.ClassA 它工作并使用我的类加载器。 但是,如果我这样做: java -cp Example.jar -Djava.system.class.loader = example.ClassLoader example.ClassB ClassB使用我的类加载器,但ClassA(由ClassB导入)使用默认的类加载器加载。 有没有办法强制Java总是使用我的类加载器(除非明确指定另一个类加载器)? 编辑:感谢下面的PaŭloEbermann的回答,我认为问题是我正在调用父类加载器(URLClassLoader)来加载我不需要触摸的类,并且那些加载的类设置为它的上下文类加载器,因此从它导入的类使用我的自定义加载器的父类加载器。 (令人困惑,抱歉)现在我可以通过手动读取每个类来使它工作,但是它似乎是多余的,因为我直接复制了URLClassLoader的代码。 有没有办法告诉父类加载器查找和定义类,但是将Class的上下文类加载器设置为自定义类?

如何使用自定义ClassLoader?

大家好,感谢您的关注! 我有一个既容易又明显的问题,但我被卡住了。 我想提供动态创建的Java类,供第三方库通过自定义ClassLoader使用。 现在我的问题是:当我不直接加载这些类时,如何设置我的自定义ClassLoader来加载这些类? 我想当我使用我的ClassLoader加载某个类时,它就变成了这个类的ClassLoader,并且从该类加载的所有类都将通过我的ClassLoader引导。 我创建了一个自定义的ClassLoader,遵循以下官方教程: http : //java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html 。 public class DynamicClassloader extends ClassLoader { private Map<String, Class> classesMap = new HashMap<String, Class>(); public DynamicClassloader(ClassLoader parent) { // Also tried super(parent); super(sun.misc.Launcher.getLauncher().getClassLoader()); } // Adding dynamically created classes public void defineClass(String name, Class clazz) { classesMap.put(name, clazz); } @Override protected Class findClass(String name) throws […]

JVM何时加载类?

假设我有以下课程: class Caller { public void createSomething() { new Something(); } } 会执行这一行: static void main() { Class clazz = Caller.class; } 导致JVM加载类Something或是延迟类加载,直到调用方法createSomething() ?

我是否有JAXB类加载器泄漏

我在Glassfish上部署了一个应用程序。 随着时间的推移,加载的课程数量攀升至数百万,而我的permgen似乎也在增加。 为了帮助排除故障,我将以下内容添加到了我的jvm参数中。 -XX:+ PrintGCDetails -XX:+ TraceClassUnloading -XX:+ TraceClassLoading 现在,当观察输出时,我看到一遍又一遍地加载相同的类。 基本上每次调用Web服务时都会使用JAXB来处理xml。 [从JVM_DefineClass加载com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID] [从JVM_DefineClass加载com.strikeiron.ZIPCodesInRadius $ JaxbAccessorF_userID ] 这是否表明泄漏? 如果是这样我该如何解决?

log4j和线程上下文类加载器

我是Java的新手,刚刚开始弄清楚类加载器的概念。 现在我对log4j有一些关于它使用线程上下文类加载器的问题。 我收到以下错误: A “org.apache.log4j.ConsoleAppender” object is not assignable to a “org.apache.log4j.Appender” variable. The class “org.apache.log4j.Appender” was loaded by [java.net.URLClassLoader@105691e] whereas object of type “org.apache.log4j.ConsoleAppender” was loaded by [sun.misc.Launcher$AppClassLoader@16930e2]. Could not instantiate appender named “CONSOLE”. A “org.apache.log4j.ConsoleAppender” object is not assignable to a “org.apache.log4j.Appender” variable. The class “org.apache.log4j.Appender” was loaded by [java.net.URLClassLoader@105691e] whereas object of […]

头脑风暴:奇怪的JPA问题,可能是classpath或jar版本问题?

我看到一个奇怪的错误消息,我正在寻找一些关于问题可能是什么的想法。 我对使用JPA有点新意。 我有一个应用程序,我使用Spring的Entity Manager Factory(LocalContainerEntityManagerFactoryBean),EclipseLink作为我的ORM提供程序,连接到MySQL DB并使用Maven构建。 我不确定这些是否重要…… 当我将此应用程序部署到Glassfish时,应用程序按预期工作。 问题是,我创建了一组独立的unit testing,以便在Glassfish之外运行,但这些测试无法正常工作。 我收到以下错误( 我已经编辑了一些类名 ) com.xyz.abc.services.persistence.entity.MyEntity cannot be cast to com.xyz.abc.services.persistence.entity.MyEntity 该对象不能转换为相同类型的类? 怎么可能? 这是一段错误的代码片段 Query q = entityManager.createNamedQuery(“MyEntity.findAll”); List entityObjects = q.getResultList(); for (Object entityObject: entityObjects) { com.xyz.abc.services.persistence.entity.MyEntity entity = (com.xyz.abc.services.persistence.entity.MyEntity) entityObject; 以前,我有这个代码产生相同的错误: CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery(); cq.select(cq.from(com.xyz.abc.services.persistence.entity.MyEntity.class)); List entityObjects = entityManager.createQuery(cq).getResultList(); for (Object entityObject: entityObjects) { […]

ClassLoader中的Java 8 ScriptEngine

我需要在’不同的类加载器’内部执行一些javascript代码。 如果是java,则每个任务都将在单独的类加载器中运行。 现在我需要这个是javascript。 我是否需要在每个类加载器中创建ScriptEngine新实例,或者可以跨类加载器共享一个实例?

如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?

我的用例是使用JDK 6中提供的ToolProvider和JavaCompiler类从java程序编译生成的源文件。源文件包含对上下文类加载器中的类的引用(它在J2EE容器中运行),但不包含在系统类加载器中。 我的理解是,默认情况下,ToolProvider将使用系统类加载器创建JavaCompiler实例。 有没有办法为JavaCompiler指定一个类加载器? 我尝试了这种方法,从IBM DeveloperWorks上的某些东西进行了修改: FileManagerImpl fm = new FileManagerImpl(compiler.getStandardFileManager(null, null, null);); 将FileManagerImpl定义为: static final class FileManagerImpl extends ForwardingJavaFileManager { public FileManagerImpl(JavaFileManager fileManager) { super(fileManager); } @Override public ClassLoader getClassLoader(JavaFileManager.Location location) { new Exception().printStackTrace(); return Thread.currentThread().getContextClassLoader(); } } 堆栈跟踪表明它仅在注释处理期间调用一次。 我validation了要编译的源文件中引用的类不在系统类路径上,但可以从上下文类加载器中获得。