类加载器分析(二)类加载器中的Module

Java ClassNotFoundException 根因解析与类加载器排错指南 ClassNotFoundException 是 Java 运行时最常见却最易误判的异常,本质并非‘类不存在’,而是 JVM 类加载机制在类路径(Classpath)或模块路径(Module Path)中未能定位目标类。其底层原理根植于双亲委派模型——Bootstrap、Extension 和 Application 三层类加载器协同工作,严格遵循委托优先、隔离加载的原则。该异常的技术价值在于暴露环境配置缺陷而非代码错误,是诊断 Classpath 断链、模块可见性缺失、ClassLoader 上下文错位等 阅读详情

类加载器中的Module

3.2.1 什么是Module

Java 9开始的新特性,并不是每个流行的Java框架必须采用,详细介绍文章英文|中文

3.2.2 ClassLoader与Module的关系
当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器完成加载  《深入理解Java虚拟机》

在Java 9开始,ClassLoader中加入Module类成员变量

    // the unnamed module for this ClassLoader
    private final Module unnamedModule;

默认如果没有专门写module-info.java文件,那么JVM编译器就会生成一个匿名模块用于强封装所有的类。

Module类用于描述模块

public final class Module implements AnnotatedElement {
  ...
    // module name and loader, these fields are read by VM
    private final String name;//模块名称
  	private final ClassLoader loader;//该模块属于哪个类加载器

    // the module descriptor
    private final ModuleDescriptor descriptor;//模块描述器,包含模块中的内容

假设一个module-info.java文件中包含如下信息

module my.module {
    requires module.name;
    exports com.my.package.name;
    uses class.name;
    provides MyInterface with MyInterfaceImpl;
    opens com.my.package;
}

这里可以看出module描述的信息包括:requires, exports, uses, provides, opens

ModuleDescriptor类中包含的属性用于描述Module中的成员变量。下面用类图的方式描述
在这里插入图片描述#### 3.2.3 类加载过程中Module的作用

在Java 9之后,类加载器加载时会首先判断是否属于某个module,如果属于,则调用module中的类加载器。
在这里插入图片描述
在这里插入图片描述

Spring Boot多模块项目Bean类型冲突:非ASCII模块名引发的类加载器问题解析 在Java多模块项目中,类加载器负责管理类路径中所有依赖的加载。其核心原理是通过双亲委派机制确保类的唯一性,但当模块名称包含非ASCII字符时,可能导致路径解析不一致,破坏这一机制。这种技术问题直接影响Spring容器的Bean管理,造成Bean类型冲突,表现为看似矛盾的错误信息。在Spring Boot多模块架构中,此类问题常出现在组件扫描和依赖注入场景。本文通过分析模块命名规范与类加载器交互,深入探讨了非ASCII字符如何引发Bean冲突,并提供了从诊断到修复的完整解决方案,帮助开发者规避多模块项目中的 阅读详情

相关推荐

Java模块化核心指南:module-info.java语法、迁移实战与最佳实践

模块化是现代软件开发中解决依赖管理、封装性和架构清晰度的核心工程实践。其原理在于通过显式声明模块边界、导出和依赖关系,取代传统平铺类路径的隐式加载模式,从而从根源上规避JAR Hell、版本冲突等问题。这一技术为构建大型、可维护的应用程序提供了坚实的架构基础,广泛应用于微服务组件封装、库开发以及复杂单体应用的内部治理。本文聚焦于Java平台模块系统(JPMS)的核心载体——module-info.java文件,深入解析其requires、exports、opens等关键指令的语义与使用场景,并结合Sprin

weixin_30879833的博客 391

从ClassCastException到模块化:解析Java类加载器与类型转换的深层关联

本文深入解析Java中ClassCastException异常的根源,揭示类加载器与模块化系统对类型转换的影响。通过Spring Boot项目中的实际案例,探讨unnamed module导致的类型识别问题,并提供从临时修复到架构优化的多层级解决方案,帮助开发者彻底规避类转换陷阱。

weixin_29722783的博客 182

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 519

从‘ClassCastException’到‘模块化’:一次Java 9+项目中的类加载器踩坑与修复实录

本文深入解析Java 9+模块化系统中类加载器的变革与常见问题,特别是‘ClassCastException’和‘unnamed module of loader 'app'’错误的成因与解决方案。通过实际案例和工具链介绍,帮助开发者理解模块化Java的类加载机制,并提供Spring生态中的适配建议与性能优化技巧。

weixin_29722783的博客 249

海康VM加密狗无法识别常见问题排查

海康VM加密狗无法识别常见问题排查

视觉人机器视觉的博客 2701

SpringBoot项目整合达梦数据库(MYSQL 转换 达梦数据库)

注意:当迁移过程中出现下面问题时,如有触发器或者外键,需要先关掉触发器和外键,然后进行迁移,不然会导致迁移失败。(2)dm.ini修改【#compatibility】的【COMPATIBLE_MODE】=4。3、添加用户:如果导入的DM数据库需要和MYSQL的用户一样,添加ROOT用户。方法一:服务器配置:设置系统兼容性(DM控制台工具),兼容MySQL。服务器配置又该有两种方式:①DM控制台工具修改;MYSQL的数据表转换成DM的数据表时,点击转换按钮。在这里操作:MYSQL数据库迁移至DM数据库。

m0_74824635的博客 2013

避坑指南:动态加载Jar时类加载器泄漏的那些事儿

本文深入探讨了Java动态加载Jar时类加载器泄漏的常见问题与解决方案。通过分析静态引用、线程上下文残留和Spring动态注册等典型泄漏场景,提供了实用的诊断工具和工程化实践建议,帮助开发者有效避免内存泄漏,提升系统稳定性。特别适合涉及热部署、动态插件开发的Java工程师参考。

weixin_30776273的博客 503

五分钟搞懂游戏开发中的抗锯齿算法

常见抗锯齿算法总结锯齿由来抗锯齿算法SSAAMSAACSAA 锯齿由来 场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一...

绿洲守望者 1万+

类加载器失效的坑

你遇到的“只能加载当前模块配置文件”的问题,其实是类加载器资源可见性受限的表现。方式是否支持跨模块加载是否受类加载器限制❌✅✅(视具体运行环境)✅(上下文依赖)Spring✅(框架处理)❌(更灵活)文件系统方式(Path/File)✅(只要路径正确)❌。

fqlya的博客 551

保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch)

本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。

weixin_29061997的博客 254

多个linux系统安装到一块硬盘(Kylin+UOS+ubuntu)

之前写过一篇类似的文档,笔者把kylin和UOS安装在一块硬盘上上一篇的文档地址多个linux系统安装到一块硬盘(Kylin+UOS)_银河麒麟系统和uos安装成双系统-优快云博客本次记录的是三个系统到一块硬件上银河麒麟:Kylin-Desktop-V10-SP1-Release-2107-arm64统信:uniontechos-desktop-20-professional-1050-arm64乌班图:ubuntu-22.04.5-live-server-arm64。

aggs1990的专栏 565

Java 类加载器调试案例

Java类加载器采用双亲委派模型,依次由Bootstrap、Extension、Application类加载器处理请求。例如,某次Web应用中同名的类被不同模块加载,导致类型转换异常。通过打印Class对象的getClassLoader(),发现一个由Tomcat加载,另一个由Spring加载,最终通过调整依赖作用域解决冲突。本文通过实际调试案例,揭示类加载器的工作原理及调试技巧,帮助开发者快速定位问题。例如某次内存泄漏排查中,通过自定义类加载器实例的弱引用监控,定位到未关闭的线程上下文加载器持有资源。

pcuurf_738的博客 271

亲测解决This application failed to start because no Qt platform plugin could be initialized.

这个问题是由于环境变量改变或者Qt的路径改变导致,解决办法是在环境变量里面重新添加Qt路径。

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 2919

黑马程序员JVM系列学习——JDK9之后的类加载器

JDK8及之前,扩展类加载器和应用程序类加载器的源码位于rt.jar包中的sun.misc.Launcher.java。1.启动类加载器使用Java编写,位于jdk.internal.ClassLoaders类中。JDK9引入了module的概念,类加载器在设计上发生了很多变化。2.扩展类加载器被替换成平台类加载器。

lyx200154的博客 600

智能手表 BOM 表与版本管理记录

试产与量产阶段 智能手表 BOM 表与版本管理记录

hoony123的博客 1053

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM 类加载与类加载器

JVM 类加载与类加载器

@Bean 232

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JVM openjdk原理和源码分析目录

逐步深入JVM核心原理

阿达King哥的博客 478

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

类路径(classpath)的原理及在Tomcat中的使用

每个Java开发者,从开始学习Java的那一天起,就认识了classpath。也许你只是不经意的输入了一个java HelloWorld 但这个时候,你已经无意中使用到了classpat...

Tomcat那些事儿 1445

Java模块化实战:从module-info.java解析到项目迁移指南

模块化是现代软件开发中的核心架构思想,它通过将系统拆分为高内聚、低耦合的独立单元来提升代码的可维护性和复用性。其原理在于定义清晰的接口契约和依赖关系,确保各模块边界明确。在Java生态中,Java 9引入的模块系统(JPMS)通过module-info.java文件实现了这一理念,解决了长期存在的“JAR地狱”和依赖管理混乱问题。该技术显著提升了大型应用的可维护性,并支持通过jlink创建定制化运行时镜像以优化部署。在实际应用场景中,模块化特别适用于微服务架构、库开发和大型企业级系统。本文聚焦于Java模块

weixin_34284188的博客 497

类加载器和双亲委派模型

点击关注公众号及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 回顾一下类加载过程 类加载器总结 双亲委派模型 双亲委派模型介绍 双亲委派模型实现源码分析 双亲委派模型的好处 如果我们不想要双亲委派模型怎么办? 自定义类加载器 推荐 公众号JavaGuide 后台回复关键字“1”,免费获取JavaGuide配套的Java工程师必...

不忘初心,奋勇前行 412

Java模块化实战:从module-info.java到项目迁移完整指南

在大型Java应用开发中,依赖管理和代码封装是保障工程效率的核心挑战。传统类路径机制常导致JAR地狱和脆弱的封装问题,影响系统稳定性。Java模块化系统通过引入module-info.java描述符,从语言层面实现了显式依赖声明和强封装机制,其原理基于模块路径替代类路径,要求每个模块明确声明依赖关系和导出包。这一技术价值在于提供了可靠的配置和强封装性,从根本上解决了依赖冲突和内部实现泄露问题。在微服务架构和云原生场景下,模块化能优化应用结构,支持使用jlink工具创建精简运行时镜像,提升容器化部署效率。本文

weixin_34175509的博客 386

Java的java.util.ServiceLoader提供者缓存与动态服务重载在模块中的行为

在模块化环境中,该行为与JPMS(Java Platform Module System)的强封装性相互作用,可能引发“服务锁定”现象——即使更新了实现类或模块,仍无法获取新实例。在Java模块化体系中,java.util.ServiceLoader作为SPI(Service Provider Interface)的核心实现,其提供者缓存机制与动态重载行为直接影响模块化应用的灵活性与扩展性。理解这些行为后,开发者可更精准地设计模块化服务的更新策略,在缓存效率与动态需求间找到平衡点。提供者缓存的运作机制。

jojctu_796的博客 203

【Java 9+模块系统实战指南】:彻底搞懂module-info与类文件IO机制

掌握Java 9+模块系统核心,解决Java 模块格 类文件读写难题。详解module-info配置、模块间类加载机制与IO操作技巧,适用于大型项目结构优化与安全管控。提升代码组织效率与运行性能,值得收藏。

CodePulse的博客 878

【Java报错已解决】org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class for bea

在Java开发的世界里,Spring框架被广泛应用。然而,开发者在使用过程中难免会遇到各种各样的报错。今天我们要聚焦的是“org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class for bean with name 'beanName'”这个报错。这个报错可能会让很多开发者感到困惑,尤其是在配置bean的时候。它就像一个隐藏在代码深处的小怪兽,阻碍着项目的正常运行。那么,我们该如何识别这个小怪兽并将它

鸽芷咕的博客 1190

Loom插件安装总提示“module not found”?这不是Bug,是JDK21 EA版隐藏的启动参数开关(附生产环境灰度验证报告)

解决Loom插件“module not found”报错难题,提供Java项目Loom响应式编程转型指南插件下载与安装全流程。适用于JDK21 EA版环境,揭示隐藏启动参数开关及灰度验证方案,保障生产平滑升级。值得收藏

Instrustar的博客 315
上一篇: Java模块化之旅
下一篇: 启动类加载器(一)名称,接口,父类
阿达King哥
博客等级 码龄23年 387粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值