jpmml / jpmml-sparkml

Java library and command-line application for converting Apache Spark ML pipelines to PMML
GNU Affero General Public License v3.0
267 stars 80 forks source link

java.lang.ClassNotFoundException: org.jpmml.converter.BaseNFeature #120

Closed liumy601 closed 2 years ago

liumy601 commented 2 years ago

Hi vruusmann,

As https://github.com/jpmml/jpmml-sparkml/issues/119, following your exception, i removed all other pmml libraries and only depend on JPMML-SparkML version 1.6.6 library, i get this error:

image

i remembered i got this error before, so i exclude these poms from jpmml-sparkml and depend on seperate low version libraries like jpmml-converter 1.4.5. did you get this exception before?

vruusmann commented 2 years ago

java.lang.ClassNotFoundException: org.jpmml.converter.BaseNFeature

Your project is missing a JPMML-Converter library.

did you get this exception before?

No, because I know how to set up my projects correctly.

First, use a proper build manager such as Apache Maven. Second, declare a JPMML-SparkML library dependency, and let the build manager to collect and download JPMML-SparkML transitive dependencies as needed.

You should not be doing this manually. You're not smarter and technically more capable than Apache Maven.

liumy601 commented 2 years ago

yes, i have used maven, i've checked jpmml-converter library, only 1.4.5 has that class org.jpmml.converter.BaseNFeature, 1.4.10 doesn't, so it gives this error.

from the errors, it seems jpmml-xgboost library is mismatch, i used 1.4.4, which version is suitable for JPMML-SparkM 1.6.6?

thanks

vruusmann commented 2 years ago

If you want to know which transitive dependencies work with a particular JPMML-SparkML library version, then simply check out the correct tag, and run the mvn dependency:tree command inside the main module.

For JPMML-SparkML version 1.6.6, do the following:

$ git clone https://github.com/jpmml/jpmml-sparkml.git
$ cd jpmml-sparkml
$ git checkout 1.6.6
$ mvn dependency:tree

The report (omitted some irrelevant parts):

[INFO] +- com.beust:jcommander:jar:1.72:compile
[INFO] +- org.apache.spark:spark-core_2.12:jar:3.0.0:provided
[INFO] +- org.jpmml:jpmml-converter:jar:1.4.10:compile
[INFO] |  +- com.google.guava:guava:jar:21.0:compile
[INFO] |  +- org.jpmml:pmml-model:jar:1.5.16:compile
[INFO] |  |  \- org.jpmml:pmml-agent:jar:1.5.16:compile
[INFO] |  \- org.jpmml:pmml-model-metro:jar:1.5.16:compile
[INFO] +- junit:junit:jar:4.13.2:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.apache.hadoop:hadoop-client:jar:2.7.4:test
[INFO] \- org.jpmml:pmml-evaluator-testing:jar:1.5.16:test
[INFO]    +- org.jpmml:pmml-evaluator:jar:1.5.16:test
[INFO]    +- org.jpmml:pmml-evaluator-extension:jar:1.5.16:test
[INFO]    +- org.jpmml:pmml-evaluator-kryo:jar:1.5.16:test
[INFO]    |  +- org.jpmml:pmml-model-kryo:jar:1.5.16:test
[INFO]    |  |  \- com.esotericsoftware:kryo:jar:5.2.2-SNAPSHOT:test (version selected from constraint [5.0.0,))
[INFO]    |  |     \- com.esotericsoftware:reflectasm:jar:1.11.9:test
[INFO]    |  \- de.javakaffee:kryo-serializers:jar:0.45:test
[INFO]    +- org.jpmml:pmml-evaluator-metro:jar:1.5.16:test
[INFO]    \- org.jpmml:pmml-evaluator-moxy:jar:1.5.16:test
[INFO]       \- org.jpmml:pmml-model-moxy:jar:1.5.16:test
[INFO]          \- org.eclipse.persistence:org.eclipse.persistence.moxy:jar:2.7.9:test (version selected from constraint [2.7.0,2.7.9])
[INFO]             \- org.eclipse.persistence:org.eclipse.persistence.core:jar:2.7.9:test
[INFO]                \- org.eclipse.persistence:org.eclipse.persistence.asm:jar:9.1.0:test

The above report says black-on-white that you MUST use JPMML-Converter 1.4.10.

If you use some other version, then that's your (not JPMML-SparkML) problem.

vruusmann commented 2 years ago

yes, i have used maven, i've checked jpmml-converter library, only 1.4.5 has that class org.jpmml.converter.BaseNFeature, 1.4.10 doesn't, so it gives this error.

That's a new classpath conflict there, completely separate from the JPMML-SparkML project.

In brief, you're again trying to mix a totally arbitrary version of the JPMML-XGBoost library with JPMML-SparkML and JPMML-Converter library versions.

You need to use an JPMML-XGBoost library version that is compatible with JPMML-Converter version 1.4.10.

liumy601 commented 2 years ago

After i upgrade jpmml-xgboost version to 1.5.6, that error is fixed and pmml is exported successfuly.