标签: classloader

Applet类加载器在applet的jar中找不到类

我开始问这个问题,然后在提交之前找出答案.我决定发布这个问题,以便遇到同样问题的其他人能够从我的错误中吸取教训.


我遇到了applet(实际上是JApplet)无法实例化另一个类的问题,该类与applet包含在同一个jar中.我在Java控制台上看到的例外是:

Exception in thread "thread applet-com.company.program.cm.hmi.MediatorApplet-1" java.lang.NoClassDefFoundError: com/company/program/cm/cs/JDataStore
    at com.company.program.cm.hmi.MediatorApplet.getMediator(MediatorApplet.java:63)
    at com.company.program.cm.hmi.MediatorApplet.init(MediatorApplet.java:49)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.company.program.cm.cs.JDataStore
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    ... 4 more
Caused by: java.io.IOException: open HTTP connection failed:http://localhost:8080/TransportHMI/pages/com/company/program/cm/cs/JDataStore.class
    at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    ... 8 more

我知道这个JDataStore类包含在jar中.如果我使用我列出的内容,jar tvf CM_Library.jar我可以看到它在适当的包下.但是,上面链接的异常使我相信类加载器不会搜索存档JDataStore,而是在Web服务器上查找JDataStore.class文件.为什么是这样?类加载器知道从jar加载MediatorApplet类,为什么不检查JDataStore呢?如果我没有在applet标签上正确指定参数,我也会在这里包含:

<applet id="mediator-applet"
        width="0"
        height="0"
        codebase="./"
        archive="CM_Library.jar"
        code="com.company.program.cm.hmi.MediatorApplet">
</applet>
Run Code Online (Sandbox Code Playgroud)

java applet classloader

4
推荐指数
1
解决办法
1万
查看次数

Websphere类加载

我们在Websphere应用服务器7中部署了一个应用程序.它在各种环境中部署并运行.但它在一个新的环境中给出了一种未找到异常的方法.在深入挖掘时,我们发现一个特定的类存在于2个罐子中,来自"错误"罐子的类被加载到新的环境中.我浏览了详细的类加载器视图,并且加载jar的顺序不同.

在进一步调查中,似乎在每个环境中加载jar文件的顺序随机变化.

2个问题:

1)WAS类加载策略取决于哪个因素以及纠正问题的任何建议?

2)更常见的是,当我们在任何java程序的类路径中指定假设*.jar时,任何JVM如何加载jar?喜欢按字母顺序或根据时间修改或任何此类文件属性?

websphere jvm web-applications classloader

4
推荐指数
1
解决办法
1万
查看次数

java反射调用已加载对象的方法

如何使用反射调用已在JVM中加载的对象的方法?我试过了

Class myClass = Class.forName("myClass");
Method m = com.test.class.getDeclaredMethod("getValue",new Class[] {});
Object result = m.invoke(myClass,null);
Run Code Online (Sandbox Code Playgroud)

但我得到java.lang.IllegalArgumentException:object不是声明类的实例.我想调用的方法是void,即不接受参数

更新 我有一个已加载类"A"的应用程序.另一个类"B"将由框架实例化.初始化类"B"时,类"A"已经加载到JVM中.我想从类"A"BUT的加载实例中调用一个方法而不在类"B"中引用"A".在答案中,似乎我必须在类"B"中创建一个"A"的新实例,但我想要访问已经加载的对象.如果我在"B"中创建"A"的新实例,为什么我要使用反射?我想念一些东西吗?

谢谢

java reflection jvm classloader

4
推荐指数
2
解决办法
2万
查看次数

强制为WAR文件自定义ClassLoader?

是否有一种标准方法(即由某些Java / J2EE / etc.spec定义)为Java Servlet容器提供自定义类加载器,以用于加载WAR文件?

在一个新项目中,我们正在扩展带有Web服务的大型商业Java软件包(Foo),这需要部署的灵活性(作为单独的服务等)。特别是,我们要避免在每个WAR文件中包含所有Foo软件​​依赖项Jar文件的必要性,因为它们很大,很大,并且随着我们开发的补丁/错误修复程序版本而变化。同样,非常不希望将所有依赖项都复制到每个Servlet容器的“ lib”目录中。

理想情况下,我想告诉Java应用服务器这些WAR文件必须使用我将提供的自定义类加载器加载,该类加载器会自动包含Foo软件​​依赖项Jars。像这样的东西(在Java伪代码中):

public class MyWarFileClassLoader extends ClassLoader {
  protected URLClassLoader urlcl;
  public MyWarFileClassLoader(File warFile) {
    File installDir = System.getEnv("FOO_HOME");
    List<File> fooEntries = new File(installDir, "jars").listFiles("*.jar");
    fooEntries.add(new File(installDir, "resources"));
    fooEntries.add(warFile);
    this.urlcl = new URLClassLoader(fooEntries);
  }
  public Class<?> findClass(String name) {
    return this.urlcl.findClass(name);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果没有标准的方法可以做到,那么无论目标Servlet容器是什么,是否都可以通过简单的方法来实现多个WAR文件的相同目标?

[编辑]

换句话说:是否有一种通用模式允许WAR文件在运行时管理它们自己的依赖关系,而不是依赖Servlet容器配置?我当然可以让WAR文件清单包含一个Class-Path属性,但是然后在构建时仍将这些条目“硬编码”,而不是在运行时自动检测到。

java war classloader java-ee

4
推荐指数
1
解决办法
3541
查看次数

覆盖rt.jar中的单个类

我正在寻找一种从引导类路径覆盖类的简洁方法rt.jar.原因是OpenJDK7错误http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7104625

修复此错误是一个微不足道的(请参阅链接的邮件列表帖子)更改为sun.awt.X11.XComponentPeer.所以我想知道是否有一种简单的方法可以在我的类路径上覆盖这个受影响的类,而不必重新打包/重建rt.jar(因此修复不会在下一次自动更新OpenJDK时丢失).

理想情况下,它也会影响Eclipse ......

我认为这java -Djava.system.class.loader=myClassLoader会奏效吗?有没有其他方法可以使用这样的"修补程序"覆盖单个类?(注意:在我自己的代码中没有使用,但在Java AWT代码中很深)

java classloader java-7

4
推荐指数
1
解决办法
2838
查看次数

JBoss7:使用ReastEasy加载器约束,使用自定义HttpRequestInterceptor的httpclient

我在使用@Named @ViewScopedJBoss-7.1.1-Final 的Bean中使用RestEasy客户端框架,以使用自定义从REST服务检索数据HttpRequestInterceptor:

RegisterBuiltin.register(ResteasyProviderFactory.getInstance());

DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.addRequestInterceptor(new PreemptiveAuthInterceptor("test","test"), 0);

ClientExecutor clientExecutor = new ApacheHttpClient4Executor(httpClient); //<---

//The error occurs above, the code below is only for completeness
MyRest rest = ProxyFactory.create(MyRest.class,
                                    "http://localhost:8080/rest",clientExecutor);
Run Code Online (Sandbox Code Playgroud)

这在独立客户端应用程序中工作正常(当我删除ClientExecutor它时也可以,但我需要它来验证REST服务).bean在一个WAR模块里面EAR,resteasy的依赖层次结构解析为:

Resteasy依赖

没有httpclienthttpcoreWAREAR.在Bean内部,我得到以下异常:

java.lang.NoClassDefFoundError: org/apache/http/HttpRequestInterceptor
Run Code Online (Sandbox Code Playgroud)

似乎很容易(虽然我想知道重新包装)并且我添加org.apache.httpcomponents:httpclient编译范围:

在此输入图像描述

不,我得到他跟随例外:

java.lang.LinkageError: loader constraint violation: when resolving method   
  "org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor.<init>    
  (Lorg/apache/http/client/HttpClient;)V"
  the class loader (instance of org/jboss/modules/ModuleClassLoader)
      of the current …
Run Code Online (Sandbox Code Playgroud)

java classloader resteasy jboss7.x

4
推荐指数
2
解决办法
7393
查看次数

如果无法解析导入语句会发生什么?

我不清楚以下内容:
JVM在需要时加载一个类,比如延迟初始化,对吧?
现在,如果类A做一个import类的B哪一类B文件系统实际上没有(如B.class被删除的或者未送达或任何原因),
那么就班A得到加载并运行,如果没有类的方法B被称为?
或者A无法运行,因为导入无法解决?
或者A被加载并运行到某一点?

java jvm class classloader

4
推荐指数
1
解决办法
238
查看次数

如何在java Web应用程序中访问WEB-INF/META-INF中的文件?

所以我读的这本书说:

与JAR文件不同,根级别/ META-INF目录不在应用程序类路径上.您不能使用ClassLoader获取此目录中的资源.然而,/ WEB-INF/classes/META-INF位于类路径上.您可以将所需的任何应用程序资源放在此目录中,并且可以通过ClassLoader访问它们.

目前在WEB-INF目录下,我有一个META-INF目录和一个名为:test.txt的文件.

如何使用ClassLoader读取此文件?

我试过这个:

URL resource = this.getClass().getClassLoader().getResource("test.txt");
System.out.println(resource);
Run Code Online (Sandbox Code Playgroud)

但是这会返回null.

我知道该文件可以像:

InputStream resourceContent = getServletContext().getResourceAsStream("/WEB-INF/META-INF/test.txt");
System.out.println(resourceContent);
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的.我想了解ClassLoader ..

谢谢.

java tomcat classloader

4
推荐指数
1
解决办法
4256
查看次数

Java类加载器无法在jar文件中查找资源

我有一个可运行的jar文件,它无法访问位于默认src目录之外的资源.根据我的理解,Class.getResource()和ClassLoader.getResource()之间有什么区别,我应该可以使用以下getResourceFile函数访问root/res/img/img1.png(参见下面的文件夹设置):

public class Foo {

    private static final ClassLoader CLASS_LOADER = Foo.class.getClassLoader();

    public static File getResourceFile(String relativePath) {
        // Since I'm using getClassLoader, the path will resolve starting from 
        // the root of the classpath and it'll take an absolute resource name
        // usage: getResourceFile("img/img1.png")
        // result: Exception in thread "main" java.lang.NullPointerException
        return new File(CLASS_LOADER.getResource(relativePath).getFile());
    }
}
Run Code Online (Sandbox Code Playgroud)

文件夹设置:

root/
    src/
        foo/
            bar/
    res/
        img/
            img1.png
        audio/
            audio1.wav
Run Code Online (Sandbox Code Playgroud)

当我尝试执行jar可执行文件时会出现问题.然而,奇怪的是我无法通过eclipse IDE复制这个,它实际上能够正确地解析路径.我已经通过(项目 - >属性 - > Java构建路径 - >添加文件夹)将资源目录添加到构建路径,因此Java应该能够在运行时找到资源文件夹. …

java jar classloader

4
推荐指数
1
解决办法
4270
查看次数

如何在第一次加载时让Java ClassLoader输出每个类

如何让Java ClassLoader首次输出每个类?

是否有java可以执行此操作的选项,或者如果我将ClassLoader子类化,并在调用super()之前简单地向其添加System.out.println(),我将如何使我的应用程序使用我的类加载器?

我为什么要这样做?

当使用java 9运行我的应用程序时,它会出现错误,但堆栈跟踪不会源自我的代码,所以我不知道是什么导致它.我的想法是将每个类输出为加载,然后我会更好地了解出错的地方.

Uncaught error fetching image:
java.lang.NullPointerException
    at java.desktop/sun.awt.image.URLImageSource.getConnection(Unknown Source)
    at java.desktop/sun.awt.image.URLImageSource.getDecoder(Unknown Source)
    at java.desktop/sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at java.desktop/sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at java.desktop/sun.awt.image.ImageFetcher.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

java classloader

4
推荐指数
1
解决办法
116
查看次数