Java 8迁移至Java 17:jdk8/jre/lib/ext依赖替代及启动问题
解决Java 17中依赖abc.jar无法加载的问题
Java 9及以后版本彻底移除了Java 8里的jdk/jre/lib/ext扩展目录机制,而且你用java -classpath ... -jar ...的启动方式本身就有问题——当使用-jar参数时,JVM会忽略-classpath设置,转而读取目标jar包(myapp.jar)的Manifest文件中配置的类路径。
下面是几种可行的解决办法:
修改myapp.jar的Manifest文件,添加依赖路径
- 先解压myapp.jar中的
META-INF/MANIFEST.MF文件到本地目录 - 在Manifest文件末尾添加一行:
Class-Path: my_path/abc.jar(路径可以是绝对路径,也可以是相对于myapp.jar的相对路径,多个依赖用空格分隔) - 重新打包myapp.jar,命令示例:
jar cfm myapp.jar META-INF/MANIFEST.MF -C 原myapp解压后的类文件目录 .
之后直接用
java -jar my_path/myapp.jar启动即可。- 先解压myapp.jar中的
直接指定主类启动,不用-jar参数
先找到myapp.jar中定义的主类(比如Manifest里的Main-Class字段值,假设是com.example.MyAppMain),然后用类路径包含两个jar的方式启动:# Linux/macOS用冒号分隔 java -classpath "my_path/abc.jar:my_path/myapp.jar" com.example.MyAppMain # Windows用分号分隔 java -classpath "my_path/abc.jar;my_path/myapp.jar" com.example.MyAppMain如果应用是模块化项目,用模块化参数启动
如果你的myapp.jar是模块化jar(包含module-info.class),可以用--module-path指定模块路径,结合--module指定主模块和主类:java --module-path "my_path/abc.jar:my_path/myapp.jar" --module 你的模块名/主类全限定名
注意:确保路径中的空格、特殊字符正确转义,或者用引号包裹路径;相对路径要以myapp.jar的启动位置为基准。
内容的提问来源于stack exchange,提问作者Lazycoder
相关产品推荐
相关产品推荐

