问题标签 [dynamic-class-loaders]

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.

0 投票
0 回答
94 浏览

jboss - 在没有 Eclipse 的情况下在 JBoss 中自动部署更改的文件

我的要求是:在我的项目文件中进行任何类型的修改时,我希望这些特定文件能够自动重新部署,而无需手动执行重建/重新部署/重新启动。

也就是说,我希望更改任何文件并保存后立即反映在我的网页上。更改的文件应自动重新部署在服务器中。

到目前为止我已经尝试过:

  1. 更改了 JBoss 中的standalone.xml 文件,以便在任何文件更改时重新部署应用程序。但这不能正确满足我的要求。此方法也多次产生内存不足错误。

  2. 想过使用 JRebel,但它不是免费的。

  3. 尝试使用 DCE VM,但没有帮助。

请建议任何替代方案,因为手动重新部署项目需要很多时间。我想通过仅在爆炸耳朵中部署更改的文件来自动化此过程。我不想使用任何 IDE。

0 投票
2 回答
1302 浏览

java - Java动态加载jar

我发现了很多关于这个论点的讨论,但没有任何解决方案适合我。

我想创建一个简单的插件(jar),其中还包含 jdbc 驱动程序以便工作。然后在更大的应用程序中使用此插件。

如果我像这样创建一个非常简单的 main:

我总是这个例外:

所以似乎 Class.forName 无法找到与我的 Plugin 类相同的包中的 jar。

我尝试了很多解决方案,但没有一个适合我。可以在不直接引用它的情况下加载 jar(它在主类的同一包中)。

谢谢

0 投票
1 回答
1113 浏览

java - RMI 服务器不会从其 HTTP 代码库服务器动态加载缺失的类

语境

这是一个使用 Java RMI 的应用程序,具有:

  • 主机 A 上的客户端和主机 B 上的服务器。
  • 主机 A 上的 HTTP 服务器,它保存客户端和服务器使用的所有类的副本。
  • RMI 注册表是从服务器代码创建的,它共享服务器 JVM 和 CLASSPATH。

对于服务器和客户端应用程序:

  • java.rmi.server.codebase属性(在代码中)设置为 HTTP 服务器 URL。
  • 具有适当策略的安全经理已就位。
  • java.rmi.server.hostname设置为 LAN 地址。

方法调用:

  • 服务器方法是使用类型参数WorkRequest(抽象类)定义的。
  • 客户端使用子类调用此方法WorkRequestSquare
  • WorkRequestSquare从未在服务器代码中提及

服务器代码

客户端代码:

当服务器在 CLASSPATH 中包含所有相关类并且不需要动态加载时,此代码有效。

问题

从服务器端的 CLASSPATH 中删除WorkRequestSquare会在客户端抛出异常(服务器端不会抛出任何东西):

WorkRequestSquare从未在服务器代码中明确提及,它应该是可动态加载的,但这不会发生。

旁路

Stuart Marks 让我知道该属性java.rmi.server.useCodebaseOnly应设置为false.

在 JDK 7u21 中,此属性的默认值已从 更改false为。设置为防止 JVM 从任何位置动态加载类,除了使用. 这意味着客户端 JVM 在编组参数时设置的代码库值被.true useCodebaseOnlytruejava.rmi.server.codebaseWorkRequestSquareuseCodebaseOnlytrue

当在服务器上useCodebaseOnly设置为false,并且WorkRequestSquare从服务器 CLASSPATH 中删除类时,服务器现在从 HTTP 服务器获取类定义。这是一个有效的绕过。

问题

由于客户端和服务器具有相同的codebase属性值,因此仍然存在异常。

何时useCodebaseOnly默认为true服务器 JVM 应该忽略codebase添加到 RMI 流中的客户端,但无论如何它应该使用自己的codebase来检索WorkRequestSquare类。

无论如何,这应该是成功的,因为客户端和服务器codebase值是相同的。

有人可以对这件事有所了解吗?

0 投票
0 回答
137 浏览

java - 在运行时加载类时出现 ClassNotFoundException

使用 Bukkit-API 我目前正在尝试创建一个插件,该插件可以在运行时编译给定 pastebin 链接的 java 代码并执行该代码。到目前为止一切正常,除了一件事:当我尝试访问一个已加载的插件时,我得到了 ClassNotFoundException。(当我使用 Bukkit-API 方法时,我没有遇到异常!)所有插件 jar 都已添加到类路径中;它目前看起来像这样:

我尝试动态加载的类:

MutliCube 的 ClassNotFoundException

在职的

RuntimeCompiler.java 的源代码:http://paste.multicu.be/axigofekip.avrasm 有点长,这就是我使用 pastebin 链接的原因)

我还注意到,当我删除 MultiCube.jar 的类路径时出现编译错误,这意味着类路径必须正确,因为可以编译源代码。

编辑:我能够通过在我的 URLClassLoader 的构造函数中添加 MultiCube.class.getClassLoader() 作为参数来修复它

0 投票
1 回答
1688 浏览

java - DRL 无法解析动态加载的类

我正在使用 drools 6 包为我的应用程序构建和运行 drl 文件。它与静态类一起工作正常。但是,当我在规则中使用动态类时,它会抛出错误

规则编译错误:[Rule name='rule 1'] com/sample/Rule_rule_11982550347.java (2:28):只能导入一个类型。com.chainsys.csapp.dynaclass.vo.SupplierdivVO 解析为一个包

即使我已经在知识库中加载了我的类加载器。以下是我的代码。

0 投票
0 回答
905 浏览

java - 从 jar 的字节数组中正确加载类

我知道有一些问题可以解决同样的问题,相信我,我已经解决了这些问题,但没有一个问题包含我的问题的答案。我想从字节数组加载一个类并验证它的内容。我有该类的 byte[] 但我无法让我的自定义类加载器实际加载它。为简单起见,我创建了以下函数来读取 jar 文件字节:

很简单。从这里开始,我使用以下代码从此流中检索类文件:

jar 文件中的结构如下所示:

如果我对 loadClass 方法使用<classname>$1.classand 传递<packagename>.<classname>$1,我将得到在运行的该类中定义的唯一方法。当我尝试使用要加载的实际类时,会出现各种异常。我将提供所有详细信息以及我的 ClassLoader“实现”的来源。

如果我将 MyClassLoader 保持原样,我将得到以下 StackTrace:

如果我删除 try 块并仅将 loadClass 留在 catch 块中:

为了解决这个问题,我从 defineClass 调用中删除了 name 属性,这会导致另一个具有以下 StackTrace 的异常:

没有 ClassCircularityError-s。我的班级使用其他班级,但这些班级没有<classname>以任何方式使用。没有从这些类导入到<packagename>.<classname>. 这是我的 jar 类的组织方式的层次结构:

老实说,我在这里看不到任何 CircularReferences。我可以调试我的应用程序,直到在 myClassLoader 中的 byte[] 包含正确字节的 defineClass 之前,这些字节正是我的 jar 中的类文件中的字节。所以让我们假设 byte[] 是正确的,但我仍然无法让 defineClass 工作。

我究竟做错了什么?

@Edit:通过根据以下内容稍微修改 MyClassLoader :

首先加载 classname$1.class 然后 classname.class 修复所有问题。现在我唯一的问题是为什么?为什么我需要同时加载 classname$1.class 和 classname.clss 才能使用 loadClass 方法返回的 Class?我知道 classname$1.class 包含嵌套类,但事实是,我没有嵌套类,甚至没有匿名类。这是它的外观:

PrintDeclaredMethod 相当简单。打印类的 CanonicalName 并在其下稍微缩进其声明的方法名称。这是输出:

这确实是正确的,因为 PooledTCPConnector 在其中声明了那些确切的函数,并且我相信 null 是包含该运行函数的 $1.class 文件。如果我遗漏了当前加载的类之一,我会得到 NoClassDefFoundError。我的问题是,为什么?

谢谢!- 乔伊

0 投票
1 回答
575 浏览

c# - 将 BeanUtils 移植到 .NET

我有一个使用动态加载类型的动态运行时配置的系统。

系统正在加载基于 XML 的类型并创建实例。然后它从 XML 文件中读取“属性”,在创建的实例上设置这些属性。目前,它直接在实例上处理简单属性,但是,这些类型可能具有调用部分未知的设置层次结构。

我正在寻找一个类似于 Java BeanUtils [ http://commons.apache.org/proper/commons-beanutils/]的 utils-library 。我希望它能够做这样的事情(伪代码):

或者可能带有扩展名:

当然反过来Get

请注意,BeanUtils 有自己的描述属性的风格,因此它适用于大多数类型的属性,包括列表。

有什么,或者可能是对解决问题的不同方法的建议?

0 投票
1 回答
1986 浏览

java - 动态重新编译和重新加载一个类

我正在用java构建一个可以接收java源文件的服务器,它应该使用JavaCompiler动态编译它,然后加载该类。然而问题是,如果服务器接收到一个同名但内容不同的文件,它仍然会加载以前的类并给出相同的输出。我注意到一些答案建议为我尝试加载的类创建一个超类并使用不同的类加载器,但是如果 java 源文件被动态发送到服务器,情况仍然如此吗?

这是我在 FileServer.java 中的编译和加载方法:

0 投票
0 回答
165 浏览

java - What's the best way to execute a .jar in java code

I need develop a "launcher" for a java application. This launcher need be able to:

  1. check if main application is up-to-date;
  2. if not, download a update;
  3. run this application and self terminate.

Something like this:

What better way of develop the step 3?

I'm trying 2 distinct ways:

1- Run another instance of Java

With the code:

Problem: the launcher still running until mainApp have finished.

2- Using ClassLoader to load .jar at runtime

Like this:

Problem: if "mainApp.jar" has dependencies, this isn't loaded.

0 投票
2 回答
2126 浏览

java - URLClassLOader 无法从 jar 动态加载类

我要ClassNotFoundException进去了loadClass

我尝试了几种代码变体,例如

但是所有的结果都变成了ClassNotFoundException

我曾尝试在 Eclipse 中调试,但类加载器实例无法从 jar 加载类。类 Vector 为空。