Sping Boot 中的混合类加载导致java.lang.NoSuchMethodError

cqoc49vn  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(146)

我有一个相当复杂的spring Boot 应用程序,它使用了一堆3:rd part包,其中包括org.ejml数学库。这个库被我的应用程序中的几个jar文件使用,例如stanford-nlp和我自己的tsne库以及我自己的LDA库。lda和tsne被构建为fat jar,包括整个ejml,而stanford-nlp以其他方式打包它。有不同版本的EJML库,但都使用一个EJML库版本,它实现了一个名为subtract(DMatrixD1,DMatrixD1,DMatrixD1)的方法,但当我运行我的Spring Boot应用程序时,它抛出了一个java.lang.NoSuchMethodError: 'void org.ejml.dense.row.CommonOps_DDRM.subtract(org.ejml.data.DMatrixD1, org.ejml.data.DMatrixD1, org.ejml.data.DMatrixD1)',这怎么可能呢?
我使用了-verbose:class来尝试找出错误代码的加载位置,看起来好像是来自LDA库(使用ejml-0.41),但是我的代码路径开始于tsne库(使用ejml-0.39),这是问题的原因吗?ejml的0.41版本可以不使用来自0.39版本的DMAtrix 1D对象吗,尽管它们都实现了subtract方法?如果是这样,我如何解决这个问题,以便(spring/java)使用正确的(我猜是0.39版本)进行减法运算...

3ks5zfa0

3ks5zfa01#

我认为您有两个选项。您可以从LDA库中排除ejml-0.41依赖项,因此它将使用ejml-0.39,但此选项不起作用。第二个选项,在我看来是正确的,是使用一个使用ejml-0.39的LDA版本,或者一个使用ejml-0.41的tsne库版本,这样就不会有相同依赖项的不同版本。

相关问题