关于 idea 启动和 jar 启动 classloader 加载顺序的问题

2020-06-12 10:47:40 +08:00
 aragakiyuii

工程里引入了某个射频机器的包,可以通过提供的 tcp 或者 serial 方式进行连接。serial 方式依赖于 RXTXcomm 这个包,但是它把这个依赖放到自己的 jar 中了(疑惑

springboot 打成 fat jar 之后大致是这样的

BOOT-INF
  -classes
  -lib
    -xxx.jar
      -lib
        -RXTXcomm.jar

tcp 方式

public class Reader {
	
    //这个里面没有用到 RXTXcomm 中的类
    public static boolean tcpConnect() {
        return doSomething();
    }
}

serial 方式

public class Reader {
	
    //这个里面使用了 RXTXcomm 中某些类
    public static boolean serialConnect() {
	return doSomething();
    }
}

我采用了 tcp 方式,通过 idea 启动没什么问题。可是打包成 jar 包启动时就会抛异常

ClassNotFoundException: gnu.io.SerialPortEventListener

我调用的静态方法没有用到SerialPortEventListener这个类,并且 Reader 这个类里定义的全局变量中也没有用到SerialPortEventListener,为什么 idea 启动时不会加载而通过 jar 的方式启动会去加载呢? classloader 不是等到使用到某个类的时候才会去 findClass 嘛?

1308 次点击
所在节点    Java
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX