我有几个单独的应用程序项目(EAR),包含多个EJB,我想将它们部署到同一个JBoss服务器上.现在,一些项目可能具有相同的EJB,但版本不同.在类似的情况下,一些项目可能使用相同"普通"类的不同版本(即在VM中加载的类,没有JNDI查找).
使用OC4J,这似乎不是一个问题,但现在使用JBoss,我得到的印象是所有内容都存在于相同的"名称空间"(或类加载器)中.我在这个假设中是否正确?
基本上,我想做(或确保)的是两件事:
从执行EJB的JNDI查找的客户端,我希望能够指示它所在的应用程序,以便返回正确的EJB版本.
在EJB中,在实例化类时,我想确保该类是使用与EJB相同的应用程序(EAR)部署的类.
我想我读过你可以为EJB配置一些"隔离"属性,我猜错了可能会解决我的第二点吗?
如何使用两个参数动态加载Java中的类,这两个参数是类文件的绝对文件路径和我想调用的方法的名称?
例如path:c:\ foo.class方法:print()
我只是对作为简单的cmd线工具的基础知识感兴趣.一个代码示例将不胜感激.
欢呼骗局
有谁知道之间有什么不同:
Class clazz = getClass().getClassLoader().loadClass(className);
Run Code Online (Sandbox Code Playgroud)
和
Class clazz = Class.forName(className);
Run Code Online (Sandbox Code Playgroud)
当我尝试两者时,它给了我相同的结果.
我有一个系统,我通过一个定义良好的访问点创建一个插件.但是,有问题的插件使用了一些框架也使用但不同版本的jar.
代码的结构是一种方式,在框架中集成的代码(扩展插件扩展点)和执行实际工作的代码非常好地解耦(基本上归结为少于10个类的API).然而,在这几个类背后隐藏着一个相当大而复杂的系统(60+ jar依赖)
问题如下:
如何确保API类实例化的任何内容都是使用独立的jar文件私有库完成的?
换句话说,如何隔离插件以使其与自己的私有库一起运行而不会干扰主应用程序的库?
----编辑----到目前为止,只有两种方法可以实现,就是嵌入一个像OSGi这样的框架,或者提供我自己的类加载器实现.后者可以完成,并且在网上提出了许多变体,虽然我发现什么都不会让我对手头系统所需的稳定性充满信心.
这让我们回到OSGi,我希望有一个更轻量级的解决方案,但也许一旦我学会了技术,它将证明可以做我想要的而不需要太多的努力.
在阅读了关于动态类加载(即从磁盘加载.class文件)之后,我有点担心.
假设我有一个MyClass.class包含该类的文件a.b.c.MyClass.假设我现在决定将文件移动到C:\(我在Windows中的根文件夹),我想动态加载这个类.这有可能吗?根据我的理解,似乎MyClass"路径总是必须是形式的*a/b/c.MyClass.
因此,以下代码似乎不起作用:
URL[] urls = new URL[] { new File("C:\\").toURL() };
URLClassLoader classLoader = new URLClassLoader(urls);
Class<?> targetClass = classLoader.loadClass("a.b.c.MyClass");
Run Code Online (Sandbox Code Playgroud)
强迫我们将.class文件放在反映其完整内部名称的目录结构中是疯狂的,IMO.我错过了什么吗?
这个事实的一个可能的暗示是,如果我决定将几个.class文件复制到一个临时目录中,这样我就可以对它们执行一些非常棒的操作,我将不得不在同一个临时目录中复制它们的所有脏路径,这是尴尬,充其量.
在一个以前工作的应用程序突然间,我得到了一个NoClassDefFoundError (wrong name)令我困惑的事情.我正在使用一个XML绑定框架,它试图通过调用ClassLoader.loadClass()配置的类名来在请求时解析绑定类.(在这种情况下,为什么它的行为超出了我的范围.)现在我得到了刚刚提到的异常java.lang.ClassLoader.defineClass().该方法的文档说,NoClassDefFoundError如果参数name不等于指定类的二进制名称,它将抛出一个.我知道在这种情况下,人们希望获得表单的例外
java.lang.NoClassDefFoundError: A (wrong name: B)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
....
Run Code Online (Sandbox Code Playgroud)
这是我实际看到的结果,但奇怪的是,在我的情况下,报告A和B完全一样!我试着调试应用程序.JDK源代码中的行如下:
c = defineClass1(name, b, off, len, protectionDomain, source);
Run Code Online (Sandbox Code Playgroud)
价值source还可以.我将字节数组保存b到类文件中并使用反编译器进行检查,然后再次确定.当然Class.forName()报告同样的错误,但真正有趣的是,如果我设置name = null在调试模式,我得到这个野兽:
java.lang.LinkageError: loader (instance of com/google/gwt/dev/shell/jetty/JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension): attempted duplicate class definition for name: "A"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:786)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
Run Code Online (Sandbox Code Playgroud)
现在我对此感到完全无能为力:(感谢您的帮助.
有问题的类加载器是com.google.gwt.dev.shell.jetty.JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension重要的.
我是新手!框架和使用wsdl2java工具.我正在开发一个游戏!需要与SOAP Web服务交互的应用程序.我有WSDL并使用jaxws从中创建对象.它正在创建一堆java类和1个接口.一旦我尝试进行webservice调用,我就会收到类加载器无法找到接口的错误.这是我的代码:
MyWebserviceBeanService service = new MyWebserviceBeanService();
MyWebserviceRemote mwr = service.getMyWebserviceBeanPort();
LoginResponse response = mwr.loginUser("xxx", "xxx");
Run Code Online (Sandbox Code Playgroud)
请注意,'MyWebserviceRemote'是接口.代码getMyWebserviceBeanPort很常见,因为它是自动生成的,但它是:
@WebEndpoint(name = "MyWebserviceBeanPort")
public MyWebserviceRemote getMyWebserviceBeanPort() {
return super.getPort(new QName("http://xxxxxxxxxx/", "MyWebserviceBeanPort"), MyWebserviceRemote.class);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试调用方法时,例如loginUser上面的方法,我得到以下stacktrace:
play.exceptions.JavaExecutionException: interface xxxx.xxxx.xxxx.MyWebserviceRemote is not visible from class loader
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.IllegalArgumentException: interface xxxx.xxxxx.xxxx.MyWebserviceRemote is not visible from class loader
at com.sun.xml.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:736)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:408)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:384)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:366)
at javax.xml.ws.Service.getPort(Service.java:119)
at xxxx.xxxx.xxxx.MyWebserviceBeanService.getMyWebserviceBeanPort(MyWebserviceBeanService.java:72)
at controllers.MyController.index(MyController.java:26)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484) …Run Code Online (Sandbox Code Playgroud) 我正在构建一个客户端服务器应用程序.在运行时,客户端应用程序从服务器应用程序加载jar文件并存储它.我将客户端和服务器应用程序作为jar文件运行.我现在想加载这个下载的jar文件中包含的类.
例如,我有一个接口A和一个实现A的类B.客户端应用程序不知道类B,它的名称甚至它的存在.客户端应用程序启动后,客户端应用程序下载一个包含jar文件的jar文件,其内容为:server/package/B.class,其中server和package是文件夹.
现在,客户端应用程序应该从下载的jar文件中加载此类B,其代码如下:
URL downloadURL = downloadFolder.toURI().toURL();
URL[] downloadURLs = new URL[] { ruleSetFolderURL };
URLClassLoader loader =
new URLClassLoader(downloadURLs);
Class tmp = loadClass(server.package.B);
Run Code Online (Sandbox Code Playgroud)
但后来我ClassNotFoundException在最后一行得到了一个.我首先要提取jar文件吗?jar文件中的文件夹结构类似于服务器应用程序的bin目录中的文件夹结构.
我有一个应用程序,它启动时加载文件.加载文件时,会初始化一些枚举.getTagGroupStartId当枚举被初始化时调用该方法.该方法采用"标记"的名称,该标记可能存在或可能不存在于加载的文件中.如果它不存在则getTagGroupStartId返回-1.
所有这一切都很好.当我加载另一个可能包含前一个文件不包含的"标记"的文件或者可能不包含前一个文件包含的"标记"时,会出现问题.在这两种情况下,我都需要更新枚举中的m_tagId值,以便枚举反映当前文件的值.如何重新加载/重新初始化枚举?
public enum ExampleEnum {
FOO("FOO_"),
BAR("BAR_"),
BAZ("BAZ_");
private final String m_tagName;
private final int m_tagId;
ExampleEnum(String tagName) {
m_tagName = tagName;
m_tagId = Tag.getTagGroupStartId(tagName);
}
// ...
}
Run Code Online (Sandbox Code Playgroud) 是否可以运行两个不同版本的jar,但在单个JVM上的不同线程上运行.如果是这样,请指导我正确的方向.
classloader ×10
java ×8
reflection ×2
classpath ×1
deployment ×1
ejb ×1
enums ×1
jar ×1
jboss ×1
jndi ×1
plugins ×1
wsdl2java ×1