目录

我的学习分享

记录精彩的程序人生

【acuibc】一个模块依赖引起的诡异问题

先看现象,之前功能一起正常,当调用getLogs获得日志后,编译无问题,执行时抛异常

SEVERE [global]
conflux.web3j.RpcException: RPC error: code = -32602, message = Invalid params: invalid type: map, expected an epoch number or 'latest_mined', 'latest_state', 'latest_checkpoint', 'latest_confirmed' or 'earliest'., data = null
at conflux.web3j.Request.sendAndGet(Request.java:69)
at com.acuilab.bc.cfx.CFXCoin.transferRecord(CFXCoin.java:66)
at com.acuilab.bc.main.wallet.CoinPanel.<init>(CoinPanel.java:30)
at com.acuilab.bc.main.wallet.WalletTopComponent.<init>(WalletTopComponent.java:66)

跟Conflux官方QB大佬确认过,其本地正常,无法复现这个错误。
image.png

然后我在本地分别建立一个普通Java程序和一个Netbeans Platform程序,执行同一段代码,也可以正常执行。真是见了鬼了。

百思不得其解,又尝试了N种情况,均以失败告终。无奈之下比较两个Netbeans Platform项目有何不同,发现包的依赖关系不同。

在示例Netbeans Platform程序中,将conflux-web3j及其依赖包web3j-4.5.5及we3j-4.5.5的依赖包统统打包到一个Wrapped Library中。而在acuibc中,各个jar包是分开多个Wrapped Library打包的。难道这就是问题所在?抱着一丝希望,在acuibc中重新打包,执行,哇哦,居然成功了!!!大半天的时间搞得脑袋都疼了,好在Happy Ending!

这个问题诡异的地方在于,抛出的异常让人以为是jar包本身的问题,而与模块依赖完全无关。

最后总结:
在Netbeans Platform应用或插件开发中,最好将需要的jar包及其以来jar包打到同一个Wrapped Library中,这样可以避免一下诡异的依赖问题;也可以避免不同模块依赖某些jar包不同版本带来的冲突。

image.png

总之,在确定哪些模块包含哪些jar包,以及模块之间的依赖,还是有些复杂的,一不小心就给项目带来麻烦,而且常常看上去不是那么直观的,需要耐心和经验才能解决好!