标签: classloader

这堂课来自哪里?

您将如何确定从哪个类(或可能是资源)加载?

我正在尝试确切地从哪里加载一个类.有谁知道你是否能找到以下内容:

  1. 该课程来自哪个Jar文件?
  2. 什么类加载器加载文件?

java jvm classloader

3
推荐指数
1
解决办法
375
查看次数

使用.getClassLoader()从目录加载所有文件.getResource()

在我的一个JUnit测试中,我试图加载目录中包含的所有文件.我曾经.getClassLoader().getResource("otherresources")找到目录.然后我做了一个新的java.io.File.然后我用来listFiles()获取所有子文件,然后.getClassLoader().getResource()再次使用来加载每个文件.

URL url = FileLoadTest.class.getClassLoader().getResource("otherresources");
File directory = new File(url.getPath());
File[] files = directory.listFiles();
Run Code Online (Sandbox Code Playgroud)

基本上,我希望能够加载目录中的所有文件,而不知道它们究竟是什么.

我可以在Eclipse中正确运行测试.当我使用Maven(mvn install)构建项目或使用surefire(mvn -Dtest=FileTest test)自行运行测试用例时,测试用例失败了NullPointerException.我认为这个问题与File api在资源部署到的JAR文件中没有按预期工作有关.

有关如何解决此问题的任何提示?

java resources path classloader getresource

3
推荐指数
1
解决办法
5863
查看次数

如何在tomcat上动态加载类?

我已经学会了如何动态地将".class"文件加载到我的程序中,但是如果我在tomcat上运行它就不起作用了.这是代码:

package testPackage;

public class ModuleEngine {

    public static void main(String pth, String name) {

        ModuleLoader loader = new ModuleLoader(pth, ClassLoader.getSystemClassLoader());

        try {
            Class clazz = loader.loadClass(name);
            Protocol execute = (Protocol)clazz.newInstance(); 
            execute.run();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

public class ModuleLoader extends ClassLoader {

    private String pathtobin;

    public ModuleLoader(String pathtobin, ClassLoader parent) {
        super(parent);    
        this.pathtobin = pathtobin;    
    }

    @Override
    public Class findClass(String className) throws ClassNotFoundException …
Run Code Online (Sandbox Code Playgroud)

java tomcat classloader

3
推荐指数
1
解决办法
2712
查看次数

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

请考虑以下情形:

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

java java-native-interface classloader

3
推荐指数
1
解决办法
3044
查看次数

AspectJ:尝试使用外部aop.xml文件时出现ClassLoading问题

我米试图aop.xml中外部化的配置,所以我删除了aop.xmlMETA-INF,并使其在服务器通过SYS管理员手工配置提供.

当我尝试使用外部aop.xml时

-Dorg.aspectj.weaver.loadtime.configuration="file:D:\Workspace\tomcat7\shared\lib\aop.xml"
Run Code Online (Sandbox Code Playgroud)

java.lang.RuntimeException: Cannot register non aspect: aspectclass....主要是因为当时尚未加载aj casses AppClassLoader.并且下次它尝试从WebAppClassLoader(在加载所有类之后)注册方面时,它工作正常,但我仍然从第一次尝试注册它时记录了异常.

ClassLoaderWeavingAdaptor.java第307行捕获并记录异常.

当调用以下行时:success = registerAspects(weaver,loader,definitions);

捕获并记录异常.

    try {
        registerOptions(weaver, loader, definitions);
        registerAspectExclude(weaver, loader, definitions);
        registerAspectInclude(weaver, loader, definitions);
        success = registerAspects(weaver, loader, definitions);
        registerIncludeExclude(weaver, loader, definitions);
        registerDump(weaver, loader, definitions);
    } catch (Exception ex) {
        trace.error("register definition failed", ex);
        success = false;
        warn("register definition failed", (ex instanceof AbortException) ? null : ex);
    }
Run Code Online (Sandbox Code Playgroud)

异常在BcelWeaver.java的以下行中精确抛出

if (type.isAspect()) {
      ......
} else { …
Run Code Online (Sandbox Code Playgroud)

java aop aspectj classloader

3
推荐指数
1
解决办法
7732
查看次数

Java类加载器错误:引起:java.io.IOException:Stream关闭

当我将我的webapp部署到Tomcat时,我遇到一个奇怪的错误,我相信类加载器问题.当我使用Jetty在本地运行我的webapp时,不会出现该错误.似乎我的.yml资源文件的输入流由于某些原因而被关闭.当我尝试将单个模块项目转换为多模块项目时,首先出现此错误.在此之前,它使用完全相同的代码在Tomcat上正常工作:

Caused by: org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed
    at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:200)
    at org.yaml.snakeyaml.reader.StreamReader.<init>(StreamReader.java:60)
    at org.yaml.snakeyaml.Yaml.load(Yaml.java:412)
    at com.config.ConfigProvider.<init>(ConfigProvider.java:20)
    ... 49 more
Caused by: java.io.IOException: Stream closed
    at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:57)
    at java.io.PushbackInputStream.read(PushbackInputStream.java:149)
    at org.yaml.snakeyaml.reader.UnicodeReader.init(UnicodeReader.java:90)
    at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:122)
    at java.io.Reader.read(Reader.java:123)
    at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:184)
    ... 55 more
Run Code Online (Sandbox Code Playgroud)

这是导致错误的行:

String s = ConfigProvider.getConfig().getString("test");
Run Code Online (Sandbox Code Playgroud)

这是ConfigProvider班级.它基本上扫描正则表达式的所有资源文件^.*\\.config\\.yml$,将其转换为a Map<String, Object>,并将获得的所有资源组合Map<String, Object>成一个Map<String, Object>:

1 public class ConfigProvider {
2     protected static final String CONFIG_PACKAGE = ConfigProvider.class.getPackage().getName();
3     protected static final Pattern CONFIG_PATH_REGEX = Pattern.compile("^.*\\.config\\.yml$");
4 
5 …
Run Code Online (Sandbox Code Playgroud)

java tomcat stream classloader maven

3
推荐指数
1
解决办法
9613
查看次数

WAR共享的容器级版本化库

在一个Java servlet容器中(最好是Tomcat,但是如果这可以在另一个容器中完成,那么这样说)我希望理论上可行的东西.我的问题是,是否存在支持它的工具,以及是否存在哪些工具(或者我应该进一步研究哪些名称).

这是我的问题:在一个servlet容器中,我想运行大量不同的WAR文件.它们共享一些大型公共库(例如Spring).乍一看,我有两个不可接受的选择:

  1. 在每个WAR文件中包含大型库(例如Spring).这是不可接受的,因为它会加载大量的Spring副本,耗尽服务器上的内存.

  2. 将大型库放在容器类路径中.现在所有WAR文件共享一个库实例(好).但这是不可接受的,因为我无法在不升级所有WAR文件的情况下升级Spring版本,并且如此大的改变难以实现.

但理论上,有一种替代方案可行:

  1. 每个版本的大型库放入容器级类路径中.做一些容器级魔术,以便每个WAR文件声明它希望使用哪个版本,并且它将在其类路径中找到它.

"魔术"必须在容器级别完成(我认为),因为这只能通过使用不同的类加载器加载库的每个版本来实现,然后调整每个WAR文件可见的类加载器.

所以,你有没有听说过这样做?如果是这样,怎么样?或者告诉我它叫什么,这样我就可以进一步研究.

java tomcat classloader servlet-container

3
推荐指数
1
解决办法
420
查看次数

无法访问Java中的资源文件夹

我试图访问Java应用程序中的资源(标记为)文件夹,但没有任何作用,返回错误的路径

我试过了:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println(classLoader.getResource("."));
Run Code Online (Sandbox Code Playgroud)

ClassLoader classLoader = Config.class.getClassLoader();
System.out.println(classLoader.getResource("."));
Run Code Online (Sandbox Code Playgroud)

但它告诉我 file:/D:/testProject/build/classes/main/,当然没有资源文件:(

如何准确访问resources文件夹?

-TestProject
 |-resources
 |-src
   |-main
Run Code Online (Sandbox Code Playgroud)

java resources classpath classloader gradle

3
推荐指数
1
解决办法
1619
查看次数

Java打印unicode故障

我目前正在编写一个程序来读取java类文件.目前,我正在读取类文件的Constant-Pool(在此处阅读)并将其打印到控制台.但是当它被打印出来时,一些unicode似乎以这种方式弄乱我的终端,它看起来像这样(如果重要的话,我正在阅读的类文件是从Kotlin编译的,而终端I我使用的是IntelliJ IDEA终端,虽然在使用常规Ubuntu终端时似乎没有出现问题.): 在IntelliJ IDEA上搞砸了终端 我注意到的是一个奇怪的Unicode序列,我认为它可能是某种逃逸序列.

这是没有奇怪的unicode序列的整个输出:

{1=UTF8: (42)'deerangle/decompiler/main/DecompilerMainKt', 2=Class index: 1, 3=UTF8: (16)'java/lang/Object', 4=Class index: 3, 5=UTF8: (4)'main', 6=UTF8: (22)'([Ljava/lang/String;)V', 7=UTF8: (35)'Lorg/jetbrains/annotations/NotNull;', 8=UTF8: (4)'args', 9=String index: 8, 10=UTF8: (30)'kotlin/jvm/internal/Intrinsics', 11=Class index: 10, 12=UTF8: (23)'checkParameterIsNotNull', 13=UTF8: (39)'(Ljava/lang/Object;Ljava/lang/String;)V', 14=Method name index: 12; Type descriptor index: 13, 15=Bootstrap method attribute index: 11; NameType index: 14, 16=UTF8: (12)'java/io/File', 17=Class index: 16, 18=UTF8: (6)'<init>', 19=UTF8: (21)'(Ljava/lang/String;)V', 20=Method name index: 18; Type descriptor index: 19, 21=Bootstrap method attribute index: 17; NameType index: 20, 22=UTF8: (15)'getAbsolutePath', 23=UTF8: …
Run Code Online (Sandbox Code Playgroud)

java unicode jvm bytecode classloader

3
推荐指数
1
解决办法
403
查看次数

Java:Extensions Class Loader在Java 13中从哪里获取类?

我已经找到的所有文档都提到了“ jre / lib / ext”文件夹,但是在我的JRE 13安装中不存在。

我猜在Java 8(可以在jre / lib / ext中看到罐子)和Java 13之间的某个地方,它们移动了,但是我无法确定何时以及如何完成。

有人可以根据扩展类当前所在的位置来详细说明新JRE的情况吗?

java classloader dynamic-class-loaders classloading java-13

3
推荐指数
1
解决办法
63
查看次数