java -cp运行之jar包加载顺序问题(非常重要)

简介: 有没有经常在项目部署时发生java.lang.NoSuchMethodError、java.lang.ClassNotFoundException与java.

有没有经常在项目部署时发生java.lang.NoSuchMethodError、java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的错误(告诉你,一般都是jar包冲突了),那么怎样排查呢?排查到jar冲突后又怎样解决呢?

(非常重要的特:java -cp 是有顺序的!!!)

1. jar冲突故障排查:

以springboot工程为例,只需在使用@SpringBootApplication的入口类上加上:

Class<?> c = Class.forName("org.aa.bb.XXClass");

System.out.println(c.getProtectionDomain().getCodeSource().getLocation())

然后启动,查看打印的jar路径,即就是当前实际加载的那个包下的类。

2. jar加载顺序举例说:

a.jar, b.jar 都有 MyTest这个类。

java -cp a.jar:b.jar

那么 这个MyTest 拿到的到底 是哪个jar包的?

答案是:cp 前面的那个(经验所知,springboot扫描加载yml、properties文件也是同理,排在前面的classpath被加载,后面的将不会被加载)。

怎么解决呢?

若是使用shell脚本添加的classpath,可参考:关于shell sort使用

在关键shell代码中需要排序`CLASSPATH`字符串:

# classpath addition for release.

for file in `ls -a "$base_dir"/libs/* | sort -r`;

do

    CLASSPATH="$CLASSPATH":"$file"

done


Oracle官网关于cp顺序说明

Specification Order

The order in which you specify multiple class path entries is

important. The Java interpreter will look for classes in the

directories in the order they appear in the class path variable. In

the previous example, the Java interpreter will first look for a

needed class in the directory /java/MyClasses. Only when it does not

find a class with the proper name in that directory will the

interpreter look in the /java/OtherClasses directory.

目录
相关文章
|
8天前
|
前端开发 JavaScript Java
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
45 1
|
2月前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
679 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
3月前
|
Java Android开发
Eclipse 创建 Java 包
Eclipse 创建 Java 包
47 1
|
3月前
|
数据采集 分布式计算 Java
Kettle的Java开发环境需要什么jar包?
【10月更文挑战第24天】Kettle的Java开发环境需要什么jar包?
197 2
|
4月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
337 5
|
4月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
234 0
Java/Spring项目的包开头为什么是com?
|
4月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
76 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
4月前
|
Java Maven Spring
用Spring导致的无法运行Java文件的问题的解决方案
本文提供了解决在IntelliJ IDEA社区版中使用Spring Initializr插件创建Spring项目后,Java文件无法运行的问题的方法,主要是通过加载Maven项目来解决。
109 0
|
4月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
229 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
4月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
340 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!

热门文章

最新文章