JPMS与Maven协同难点在于模块名与Maven坐标无自动映射,需手动在module-info.java中声明合法模块名(如user.service),并显式桥接依赖;Automatic-Module-Name缺失会导致运行时模块解析断裂,须优先选用已声明该属性的第三方库版本。
Java模块化系统(JPMS)与Maven项目协同工作时,命名空间变量映射的难点,本质是
模块名(module name)与Maven坐标(groupId:artifactId)不自动对齐
,导致模块声明、依赖解析、运行时加载出现断层。这不是Maven本身的问题,而是JPMS规范与Maven约定之间存在语义鸿沟——Maven用坐标标识构件,JPMS用模块名标识运行时单元,二者需显式桥接。
明确模块名来源:不能依赖artifactId自动推导
Maven不会自动生成或注入
中的
名称。Java编译器只认
里写的字面量模块名,与pom.xml中
完全无关。
若pom.xml中
,模块名仍需手动写成
(推荐用点分命名,符合JPMS惯例)
模块名一旦确定,所有
、
、
等指令都基于此名,与Maven坐标无语法绑定
避免使用短横线(
)或数字开头的模块名,Java模块名必须是合法的Java标识符
解决Automatic-Module-Name缺失导致的依赖断裂
当你的模块依赖第三方库(如
),而该库未声明
,JVM会为其生成一个“自动模块名”(如
),但这种名称不稳定、不可预测,且无法被
可靠引用。
优先选用已声明
的版本(例如
),其MANIFEST.MF中含
若无法升级,可在自己的
中用
临时兼容:
,但仅限编译期,运行时仍可能失败
对未模块化的JAR,Maven构建不受影响,但JPMS运行时会将其视为“未命名模块”,所有包默认可读,失去强封装性
确保Maven资源处理不破坏模块结构
Maven默认将
下的文件复制到
根路径,若其中包含
以外的类文件,或错误覆盖了模块元数据,会导致模块解析失败。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
确认
位于
顶层(与包声明同级),而非子包内
禁用对
的资源过滤(避免Maven误将占位符替换进模块声明):
构建后检查
是否存在,且反编译验证模块名与声明一致
IDEA中同步模块视图与Maven结构
IntelliJ IDEA默认按Maven模块组织项目,但JPMS模块需额外启用支持,否则
仅被当作普通源文件,不参与模块图解析。
进入
,选中对应模块,在
页签底部勾选
和
在
页签中,确保所有JPMS依赖(含自动模块)显示为
类型,而非
若看到多个
节点,说明IDE未识别父POM层级——先按标准方式重导入(选择含父
的根目录),再启用模块路径
module-info.javamodule xxxmodule-info.javauser-service module user.servicerequiresexportsopens-dnsjavaAutomatic-Module-Namednsjavarequires dnsjavaAutomatic-Module-Namednsjava:3.5.2+Automatic-Module-Name: dnsjavamodule-info.javarequires staticrequires static dnsjava;src/main/resourcestarget/classesmodule-info.classmodule-info.javasrc/main/javamodule-info.java
org.apache.maven.plugins
maven-resources-plugin
java
target/classes/module-info.classmodule-info.javaFile → Project Structure → ModulesSourcesEnable annotation processingUse module path instead of classpathDependenciesModule LibraryJar LibraryRootpom.xml