Tag: classloader

找到加载特定类的ClassLoader

有没有办法确定哪个ClassLoader加载特定的类? 或者更具体地说,从特定类的加载位置? 我有一个加载旧的db驱动程序类的情况。 我想找到加载旧驱动程序的文件。 我最初的方法是在ClassLoader.loadClass(..)方法上设置一个调试点,并在加载类后停止vm以查看哪个类加载器正在加载它。 不幸的是,loadClass方法经常被调用,很难在类加载的地方停止。 我将尝试设置断点filter。 但是,还有另一个问题:由于ClassLoader体系结构,即使ClassLoader不负责加载,也会调用loadClass。 必须有更好的方法来实现我想要的。 您是否有想法或建议在哪里寻找解决方案?

从外部jar或外部类路径动态加载的Map实体

我需要映射未在hibernate.cfg.xml中列出的实体,这些类是从arbitraty文件夹动态加载的。 我正在尝试注册一个ClassLoaderService以更改加载行为,如果类在编译时定义并存在于类路径中,则以下代码运行正常,但如果我尝试映射一个以dinamically加载的类,则会得到ClassNotFoundException。 关于同一问题有一些问题,但我没有找到任何有效的解决方案。 URL file = ConsultaBase.class.getProtectionDomain().getCodeSource().getLocation().toURI().resolve(“implementacao/”).resolve(“hibernate.cfg.xml”).toURL(); Configuration configuration = new Configuration() .addAnnotatedClass(Registro.class).configure(file); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder ( new BootstrapServiceRegistryImpl( new ClassLoaderServicePirilampo(Registro.class.getClassLoader()), new LinkedHashSet() ) ) .applySettings(configuration.getProperties()) .addService(ClassLoaderService.class, new ClassLoaderServicePirilampo()) .build(); //this line throws ClassNotFoundException sessionFactory = configuration.buildSessionFactory(serviceRegistry); 我扩展了ClassLoaderServiceImpl以便记录所请求的类,并注意到从JUnit运行,从定义类的项目运行,它工作正常,我从服务获取类加载日志。 但是,如果我添加了以语音方式加载的注释类(来自GroovyClassLoader),则服务永远不会收到对同一类的请求。 最后一行抛出了以下错误: 17:06:49 ERROR [AssertionFailure] HHH000099: an assertion failure occured (this may indicate a bug […]

执行在java中通过网络发送的类文件

我正在尝试发送一个类文件,以便将“工作”从客户端卸载到服务器。 我发送一个类文件“MyClass.class”并成功接收它为“MyFooClass.class”。 我需要在服务器端执行MyFooClass的main()并返回结果。 我试图用类加载器加载MyFooClass但得到ClassNotFoundException。 请帮助。 阿迪亚

在tomcat中重新加载类文件

我在运行时创建一个类文件。 我想用类加载器中的更新版本替换现有的类文件。 它类似于热交换(例如JRebel),它避免了服务器重启和重新部署。 我找到了tomcat用于上下文重载的context.xml方法。 但在生产环境中它并不是很有用。 我们可以在运行时使用ClassLoader注册类吗? 请建议是否有任何替代方法在运行时重新加载类。 我使用以下代码来检索当前的classLoader。 ClassLoader classLoader = LoggingAspect.class.getClassLoader(); 下面是load class方法的实现。 public class AspectClassLoader extends ClassLoader{ @Override public synchronized Class loadClass(String name) throws ClassNotFoundException { String customLoadClass = “com.log.LoggingAspect”; try { if(!customLoadClass.equals(name)) { return super.loadClass(name); } else { URL classLoadUrl = new URL(this.reloadClassUrl); URLConnection connection = classLoadUrl.openConnection(); InputStream input = connection.getInputStream(); ByteArrayOutputStream […]

Tomcat6忽略web-inf / lib

简介: Tomcat6无法识别WebRoot / WEB-INF / lib中的ojdbc14.jar。 我想我不需要配置任何东西,只需将.jar文件放在那里就可以了。 细节: 我已经创建了一个Web应用程序并将ojdbc14.jar放在WEB-INF / lib文件夹中。 当我启动Tomcat6并访问index.jsp页面时,该页面创建了一个启动与我的oracle数据库连接的对象 ,出现错误,说“无法加载JDBC驱动程序类’oracle.jdbc.OracleDriver’”。 显然Tomcat6无法识别web-inf / lib / ojdbc14.jar中的’oracle.jdbc.OracleDriver’类 。 我做了一些研究并推测出以下原因: Tomcat6有一些不同的加载类的方法。 他们在发布的每个版本中都会更改它 要么 Tomcat6有一个错误。 我在Tomcat3中发现了一个类似的错误(参见https://bugs.eclipse.org/bugs/show_bug.cgi?id=249044 )。 但是我怀疑这个bug可以持续这么多版本。 Tomcat6已将ojdbc14.jar的内容包含在自己的lib文件中,并且再次将其添加到web-inf / lib会产生冲突。 我不相信这一点,因为从WEB-INF / lib删除ojdbc14.jar后,问题仍然存在。 这是我的Web应用程序结构: 的WebRoot WEB-INF 类 ‘用于启动连接的类’ LIB 为ojdbc14.jar 的index.jsp 错误: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class ‘oracle.jdbc.OracleDriver’ at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:766) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540) at com.demo6.DataSourceExample.getConnection(DataSourceExample.java:18) […]

在log4j中扩展PatternLayout时出现问题

我创建了一个新类NewLinePatternLayout.java,它扩展了log4j的PatternLayout.java。 下面是我的log4j.properties。 log4j.rootLogger=INFO, R log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=${catalina.home}/logs/tomcat.log log4j.appender.R.MaxFileSize=10MB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=com.myCompany.utils.NewLinePatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c – %m%n 我收到如下错误: log4j:ERROR The class “org.apache.log4j.Layout” was loaded by log4j:ERROR [WebappClassLoader delegate: false repositories: /WEB-INF/classes/ ———-> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@620a3d3b ] whereas object of type log4j:ERROR “com.myCompany.utils.NewLinePatternLayout” was loaded by [org.apache.catalina.loader.StandardClassLoader@620a3d3b]. log4j:ERROR No layout set for the appender named [R]. log4j:ERROR A “com.myCompany.utils.NewLinePatternLayout” […]

由不同的类加载器加载的相同本机库

请考虑以下情形: 我有两个java类,使用不同的系统类加载器加载。 我有一个实现了队列的本机库。 这两个类都将加载相同的库,并将元素添加到队列中。 可能吗? 如果是这样,本地库实现是否将在这两个类之间共享。

我得到一个“线程中的exception”主“java.lang.NoClassDefFoundError:org / openqa / selenium / WebDriver”

我添加了selenium-standalone.jar和selenium-java.jar但是在运行基本程序时我仍然遇到以下exception, 线程“main”中的exceptionjava.lang.NoClassDefFoundError:org / openqa / selenium / WebDriver(错误名称:org / openqa / selenium / Webdriver),位于java.lang.ClassLoader的java.lang.ClassLoader.defineClass1(Native Method)中。 java.securityClassLoader.defineClass(URLClassLoader.java:449)中的java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)中的defineClass(ClassLoader.java:791),java.net.URLClassLoader.access $ 100(URLClassLoader。 java:71)at java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)at java.net.URLClassLoader $ 1.run(URLClassLoader.java:355)at java.security.AccessController.doPrivileged(Native Method)at java位于java.lang上的sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java :)的java.lang.ClassLoader.loadClass(ClassLoader.java:423)中的.net.URLClassLoader.findClass(URLClassLoader.java:354)。 ClassLoader.loadClass(ClassLoader.java:356)位于java.lang.Class的java.lang.Class.privateGetDeclaredMethods(Class.java:2442)的java.lang.Class.getDeclaredMethods0(Native Method)中。 getMethod0(Class.java:2685)ata.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:488)at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java)中的java.lang.Class.getMethod(Class.java:1620) :480) 请提供解决方案以及解决此问题的正确步骤

动态类重新加载仅在调试模式下工作,为什么/如何真正起作用?

我有一个棘手的问题。 我的java程序正在循环这样的事情: 环: 将已编译的java类的外部文件读入byte []数组。 创建我自己的类加载器的新实例。 从readed文件到classloader的这个实例的setbytes。 使用创建的类加载器从外部文件创建类的对象的新实例。 调用所创建对象的任何方法。 问题出在哪里。 当我在调试模式下运行此程序时,它的行为与我期望的一样,因此如果外部文件更改了类加载器,则加载新版本的类并执行新版本(如果文件未更改,则当然也加载旧版本)。 但是当我运行这个程序时,不是在调试模式下,它总是执行旧版本,尽管readed文件已经改变。 也许对类加载问题和JVM行为有更深入了解的人可以向我解释这种行为。

Java 9 – 在运行时动态添加jar

我有Java 9的类加载器问题。 此代码适用于以前的Java版本: private static void addNewURL(URL u) throws IOException { final Class[] newParameters = new Class[]{URL.class}; URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class newClass = URLClassLoader.class; try { Method method = newClass.getDeclaredMethod(“addNewURL”, newParameters ); method.setAccessible(true); method.invoke(urlClassLoader, new Object[]{u}); } catch (Throwable t) { throw new IOException(“Error, could not add URL to system classloader”); } } […]