Tag: urlclassloader

在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 […]

检测Java JAR /代码篡改

我正在编写一个作为JAR文件分发的软件。 目前,这个JAR文件可以被篡改,以检索和保存我们的服务器通过URLClassLoader传输的另一个文件,进行反编译,并在我们的代码中找到应该保持私有的各种东西,以保证使用它的客户端的安全性。 基本上,我想实现一种方法来检查原始JAR是否被篡改。 我知道通过在原始类中实现对SignedObject有效性的检查是不可能的,因为Java的性质可以被反编译,但是还有其他一些方法可以确定代码是否在原始代码中被篡改文件? 此检查可以通过下载的中间类来检查有效性,或任何其他可以保证工作的方法。 我整天坐在这里试图找到解决这个问题的方法。 欢迎任何帮助。

URLClassLoader.addURL(URL)是否遵守META-INF / MANIFEST.MF

如果我有一个jar,其中包含MANIFEST.MF的Class-Path条目。 如果我将jar添加到URLClassLoader ,那么Class-Path条目中的jar也会添加到classloader吗? 我是否需要内省我想要添加到classloader的jar来检测它并为它们中的每一个调用addURL (递归)?

如何动态加载目录中的所有jar?

嗨,我正在创建一个插件,需要动态加载jar并访问这些jar的类和方法。 我尝试使用URLClassLoader,并能够加载类,如下所示 URL myJarFile = new URL(“jar”,””,”file:”+jarPath); URLClassLoader sysLoader =(URLClassLoader)ClassLoader.getSystemClassLoader(); Class sysClass = URLClassLoader.class; Method sysMethod = sysClass.getDeclaredMethod(“addURL”, new Class[]{URL.class}); sysMethod.setAccessible(true); sysMethod.invoke(sysLoader, new Object[]{myJarFile}); 但问题是我们必须通过单独指定其名称来将类加载到classLoader中。 我想要的是从class-path中的所有jar加载所有类,并在任何时间点访问它们。 是否可以使用URLClassLoader? 如果没有,那么其他选择是什么? OSGI实现这一目标有多大帮助? 提前致谢!

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”); } } […]

动态加载jar

在我的java应用程序中,我将一个jar文件(与Maven shade插件一起打包)读入一个字节流。 在jar中,有一个在POM.xml定义的入口点类 … … org.apache.maven.plugins maven-jar-plugin com.mycompany.TheEntryPoint 如何动态地将这样的类加载到我的Java应用程序中? 更新: jar作为字节流加载,不驻留在文件系统或URL中

Java classLoader困境与锁定的jar子

我正在玩Java中的classLoaders并注意到一件奇怪的事情。 如果classLoader从jar加载一个类,即使你没有引用你的classLoader,这个jar也会无限期地被锁定。 在下面的示例中,jar包含一个名为HelloWorld的类。 我所做的是尝试通过classLoader加载jar中包含的类,该类动态地添加jar。 如果将skip设置为true并且不调用Class.forName ,则可以删除jar,但如果不跳过,即使不引用classLoader ( classLoader = null ),也不能删除jar,直到JVM退出。 这是为什么? PS:我使用的是java 6,代码非常冗长,用于测试目的 package loader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class TestClassLoader { private URLClassLoader classLoader; public TestClassLoader() throws MalformedURLException, IOException { System.out.println(“Copying jar”); if (copyJar()) { System.out.println(“Copying SUCCESS”); performFirstCheck(); } else { System.out.println(“Copying […]

URLClassLoader将Annotation加载为com.sun。$ Proxy $ 27

我正在尝试动态加载java类。 基本思想是,jar包含在运行时动态加载的模块。 我就是这样做的(我知道它很hacky,但没有其他方法可以动态地将jar添加到已经存在的类加载器中): Method method = URLClassLoader.class.getDeclaredMethod(“addURL”, new Class[] { URL.class }); method.setAccessible(true); method.invoke(moduleLoader, new Object[] { file.toURI().toURL() }); Class fooClass = moduleLoader.loadClass(“com.coderunner.Foo”); Object foo = fooClass.newInstance(); 每个模块都使用@Module注释进行注释。 因此,为了获得有关模块的更多信息,我尝试获取注释。 问题是foo上的注释是com.sun。$ Proxy $ 27而不是com.coderunner.Module,因此我得到了一个 ClassCastException: Cannot cast com.sun.proxy.$Proxy42 (id=64) to com.coderunner.Module 我不得不说我有点困惑这里发生的事情。 我想做什么? 怎么样? 编辑:我也许应该提一下我在spring / spring-mvc和tomcat环境中尝试这个。

使用URLClassLoader重新加载jar时出现问题

我需要为应用程序的某些部分添加插件function到现有应用程序。 我希望能够在运行时添加一个jar,应用程序应该能够从jar加载一个类而无需重新启动应用程序。 到现在为止还挺好。 我使用URLClassLoader在线发现了一些样本,它运行正常。 我还希望能够在jar的更新版本可用时重新加载相同的类。 我再次找到了一些示例和实现这一点的关键,据我所知,我需要为每个新的加载使用一个新的类加载器实例。 我写了一些示例代码但是遇到了NullPointerException。 首先让我告诉你们代码: package test.misc; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import plugin.misc.IPlugin; public class TestJarLoading { public static void main(String[] args) { IPlugin plugin = null; while(true) { try { File file = new File(“C:\\plugins\\test.jar”); String classToLoad = “jartest.TestPlugin”; URL jarUrl = new URL(“jar”, “”,”file:” + file.getAbsolutePath()+”!/”); URLClassLoader cl […]

java web start替代

我们正在寻找Java web start的替代方案,它可以有效地执行相同的操作,只是更好地实现。 我们遇到了大麻烦。 我们有一些XP桌面办公室,所有办公室都略有不同,到目前为止,只有少数办公室没有认真调整。 问题与不能很好地使用代理设置(使用Java控制面板中的直接连接允许它工作),拒绝在设置“-Xmx”之类的参数时运行但在不运行时运行正常(直到它运行内存不足)和其他我们无法解决的奇怪问题。 Web开始工作的方式正是我们想要的,即连接到具有应用程序的服务器,下载任何已更改的内容,保留jar缓存等。其他团队在这里使用’clickonce’作为他们的C#应用​​程序,它确实有效地同样的事情,但似乎没那么麻烦。 我确信我们并不是唯一遇到这种情况的人,但搜索并没有真正显示任何替代方案。 我们已经考虑编写一个存根本地应用程序,它本质上只是一个URLClassLoader,它可以动态地通过网络加载我们的应用程序,但不幸的是,它与其他办公室相比太慢了。 有人有主意吗? 谢谢 更新 如果有人对最终发生的事情感到好奇,我们在一个月左右的时间内给了webstart,但是继续遇到问题,所以我们实现了自己的版本。 它基本上只是一个存根,它有一个指向Web服务器的URL类加载器。 这是<200行代码,它已经运行了好几个月。 它并不理想,但在有人改进webstart之前我们会坚持下去。 更新2018年 所以,几年后,我正在研究一个同样问题的新项目。 这次我们使用的是getdown,而不是编写我们自己的webstart实现。 我们发现这是对网络开始的巨大改进,并且它对我们来说非常好。