java模块化项目中添加第三方库

在Java 9及之后的模块化系统中,module-info.java文件引入了一种新的依赖管理机制,这与传统的类路径(classpath)管理方式不同。你遇到的问题通常是因为手动添加的第三方库没有模块化信息(没有自己的module-info.class),这导致它们不能被模块系统识别。

原因分析

  1. 未模块化的第三方库

    • 大部分第三方库并没有更新以支持Java的模块系统,即它们没有自己的module-info.java文件。
    • 这些库只能通过类路径(classpath)而不是模块路径(module path)被识别和使用。
  2. 模块路径 vs 类路径

    • 当你使用module-info.java文件时,Java编译器和运行时默认会使用模块路径来解析依赖。
    • 没有模块化信息的第三方库无法通过模块路径解析,因此会导致导入失败。

解决方法

有几种方法可以解决这个问题:

方法一:使用自动模块名称

如果你想保留module-info.java文件,可以将未模块化的第三方库放在模块路径中,Java会为它们分配一个自动模块名称。你可以在module-info.java中使用这个自动模块名称。

  1. 确定自动模块名称

    • 自动模块名称通常是JAR文件名去掉版本号和后缀,例如mylib-1.0.jar会被自动命名为mylib.
  2.      2. 在module-info.java中使用requires语句

module com.example.myapp {
    requires java.logging;
    requires mylib; // 自动模块名称
}
方法二:在类路径上使用第三方库

如果自动模块名称无法工作,或者你不确定自动模块名称,你可以将第三方库放在类路径上。

  1. 不使用模块系统

    • 通过删除module-info.java文件,所有库都会默认使用类路径方式,解决模块路径的问题。
  2. 混合使用类路径和模块路径

    • 使用类路径和模块路径混合的方式。确保第三方库在类路径上,而你的代码在模块路径上。
  3.      2. 编译和运行命令

  4. 编译时指定模块路径和类路径:

  5. javac -p mods -cp libs/* -d out $(find . -name "*.java")
    

    运行时指定模块路径和类路径:

  6. java -p mods -cp libs/* -m com.example.myapp/com.example.myapp.Main
    
    方法三:使用jdeps工具生成模块信息

    你可以使用jdeps工具生成简化的模块信息,创建一个模块化的JAR文件。

  7. 使用jdeps工具生成module-info.java

  8. jdeps --generate-module-info . path/to/your/library.jar
    
  9. 将生成的模块信息合并到你的项目中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值