blazegraph / database

Blazegraph High Performance Graph Database
GNU General Public License v2.0
871 stars 170 forks source link

Using the unexpected method, due to dependency conflicts on com.fasterxml.jackson.core:jackson-core #180

Open HelloCoCooo opened 3 years ago

HelloCoCooo commented 3 years ago

Hi, in database/rdf-properties, there are mulptiple versions of library com.fasterxml.jackson.core:jackson-core. However, according to Maven's dependency management strategy: "first declaration wins", only com.fasterxml.jackson.core:jackson-core:2.4.4 can be loaded, and com.fasterxml.jackson.core:jackson-core:2.9.6 will be shadowed.

Your project expects to reference the method <com.fasterxml.jackson.core.json.ReaderBasedJsonParser: getTokenLocation()Lcom/fasterxml/jackson/core/JsonLocation;> via com.fasterxml.jackson.core:jackson-databind:jar:2.9.6, which is included in the shaded version com.fasterxml.jackson.core:jackson-core:2.9.6 (original dependency path). However, this method is missing in the actual loaded versioncom.fasterxml.jackson.core:jackson-core:2.4.4. Surprisingly, it will not cause NoSuchMethodError at rumtime. By further analyzing, I found that the caller(com.fasterxml.jackson.core:jackson-databind:jar:2.9.6) would invoke the method getTokenLocation() defined in com.fasterxml.jackson.core.json.ReaderBasedJsonParser's superclass, due to dynamic binding mechanism (actual dependency path).

However, methods <com.fasterxml.jackson.core.base.ParserBase: getTokenLocation()Lcom/fasterxml/jackson/core/JsonLocation;> and <com.fasterxml.jackson.core.json.ReaderBasedJsonParser: getTokenLocation()Lcom/fasterxml/jackson/core/JsonLocation;> have different implementations, which will lead to buggy behaviors-----

Code snippet of <com.fasterxml.jackson.core.json.ReaderBasedJsonParser: getTokenLocation()Lcom/fasterxml/jackson/core/JsonLocation;> in com.fasterxml.jackson.core:jackson-core:2.9.6 (shadowed but expected to invoke):

public JsonLocation getTokenLocation()
    {
        if (_currToken == JsonToken.FIELD_NAME) {
            long total = _currInputProcessed + (_nameStartOffset-1);
            return new JsonLocation(_getSourceReference(),
                    -1L, total, _nameStartRow, _nameStartCol);
        }
        return new JsonLocation(_getSourceReference(),
                -1L, _tokenInputTotal-1, _tokenInputRow, _tokenInputCol);
    }

Code snippet of <com.fasterxml.jackson.core.base.ParserBase: getTokenLocation()Lcom/fasterxml/jackson/core/JsonLocation;> in com.fasterxml.jackson.core:jackson-core:2.4.4 (loaded version):

public JsonLocation getTokenLocation() {
        return new JsonLocation(_ioContext.getSourceReference(),
                -1L, getTokenCharacterOffset(), // bytes, chars
                getTokenLineNr(),
                getTokenColumnNr());
    }

database

Actual dependency path:

<com.bigdata.rdf.ServiceProviderHook: forceLoad()V> /home/wwww/sensor/unzip/database-BLAZEGRAPH_2_1_6_RC/rdf-properties/target/classes
<com.fasterxml.jackson.databind.MappingIterator: next()Ljava/lang/Object;> /home/wwww/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar
<com.fasterxml.jackson.databind.MappingIterator: nextValue()Ljava/lang/Object;> /home/wwww/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar
<com.fasterxml.jackson.databind.deser.BeanDeserializer: deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object;> /home/wwww/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar
<com.fasterxml.jackson.databind.deser.BeanDeserializer: deserializeWithExternalTypeId(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object;> /home/wwww/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar
<com.fasterxml.jackson.databind.deser.impl.ExternalTypeHandler: complete(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object;> /home/wwww/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar
<com.fasterxml.jackson.databind.util.TokenBuffer: asParser(Lcom/fasterxml/jackson/core/JsonParser;)Lcom/fasterxml/jackson/core/JsonParser;> /home/wwww/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.9.6/jackson-databind-2.9.6.jar
<com.fasterxml.jackson.core.json.ReaderBasedJsonParser: getTokenLocation()Lcom/fasterxml/jackson/core/JsonLocation;>

Dependency tree--

[INFO] com.blazegraph:rdf-properties:jar:2.1.6-SNAPSHOT [INFO] +- commons-io:commons-io:jar:2.1:compile [INFO] +- org.openrdf.sesame:sesame-util:jar:2.8.11:compile [INFO] | +- com.google.guava:guava:jar:18.0:compile [INFO] | - org.slf4j:slf4j-api:jar:1.7.10:compile [INFO] +- org.openrdf.sesame:sesame-rio-rdfxml:jar:2.8.11:compile [INFO] | +- org.openrdf.sesame:sesame-model:jar:2.8.11:compile [INFO] | | - (org.openrdf.sesame:sesame-util:jar:2.8.11:compile - omitted for duplicate) [INFO] | +- org.openrdf.sesame:sesame-rio-api:jar:2.8.11:compile [INFO] | | +- (org.openrdf.sesame:sesame-model:jar:2.8.11:compile - omitted for duplicate) [INFO] | | - (org.openrdf.sesame:sesame-util:jar:2.8.11:compile - omitted for duplicate) [INFO] | +- org.openrdf.sesame:sesame-rio-datatypes:jar:2.8.11:runtime [INFO] | | +- (org.openrdf.sesame:sesame-model:jar:2.8.11:runtime - omitted for duplicate) [INFO] | | +- (org.openrdf.sesame:sesame-rio-api:jar:2.8.11:runtime - omitted for duplicate) [INFO] | | - (org.openrdf.sesame:sesame-util:jar:2.8.11:runtime - omitted for duplicate) [INFO] | +- org.openrdf.sesame:sesame-rio-languages:jar:2.8.11:runtime [INFO] | | +- (org.openrdf.sesame:sesame-model:jar:2.8.11:runtime - omitted for duplicate) [INFO] | | +- (org.openrdf.sesame:sesame-rio-api:jar:2.8.11:runtime - omitted for duplicate) [INFO] | | - (org.openrdf.sesame:sesame-util:jar:2.8.11:runtime - omitted for duplicate) [INFO] | +- (org.openrdf.sesame:sesame-util:jar:2.8.11:compile - omitted for duplicate) [INFO] | - (commons-io:commons-io:jar:2.4:compile - omitted for conflict with 2.1) [INFO] +- org.openrdf.sesame:sesame-queryresultio-sparqljson:jar:2.8.11:compile [INFO] | +- org.openrdf.sesame:sesame-queryresultio-api:jar:2.8.11:compile [INFO] | | +- (org.openrdf.sesame:sesame-model:jar:2.8.11:compile - omitted for duplicate) [INFO] | | +- (org.openrdf.sesame:sesame-query:jar:2.8.11:compile - omitted for duplicate) [INFO] | | +- (org.openrdf.sesame:sesame-rio-api:jar:2.8.11:compile - omitted for duplicate) [INFO] | | - (org.openrdf.sesame:sesame-util:jar:2.8.11:compile - omitted for duplicate) [INFO] | +- org.openrdf.sesame:sesame-query:jar:2.8.11:compile [INFO] | | +- (org.openrdf.sesame:sesame-model:jar:2.8.11:compile - omitted for duplicate) [INFO] | | - (org.openrdf.sesame:sesame-rio-api:jar:2.8.11:compile - omitted for duplicate) [INFO] | +- (org.openrdf.sesame:sesame-model:jar:2.8.11:compile - omitted for duplicate) [INFO] | +- (org.openrdf.sesame:sesame-util:jar:2.8.11:compile - omitted for duplicate) [INFO] | - com.fasterxml.jackson.core:jackson-core:jar:2.4.4:compile [INFO] +- com.github.jsonld-java:jsonld-java:jar:0.12.1:compile [INFO] | +- (com.fasterxml.jackson.core:jackson-core:jar:2.9.6:compile - omitted for conflict with 2.4.4) [INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.6:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile [INFO] | | - (com.fasterxml.jackson.core:jackson-core:jar:2.9.6:compile - omitted for conflict with 2.4.4) [INFO] | +- org.apache.httpcomponents:httpclient-osgi:jar:4.5.6:compile [INFO] | | +- org.apache.httpcomponents:httpclient:jar:4.5.6:compile [INFO] | | | +- (org.apache.httpcomponents:httpcore:jar:4.4.10:compile - omitted for duplicate) [INFO] | | | - (commons-codec:commons-codec:jar:1.10:compile - omitted for duplicate) [INFO] | | +- commons-codec:commons-codec:jar:1.10:compile [INFO] | | +- org.apache.httpcomponents:httpmime:jar:4.5.6:compile [INFO] | | | - (org.apache.httpcomponents:httpclient:jar:4.5.6:compile - omitted for duplicate) [INFO] | | +- org.apache.httpcomponents:httpclient-cache:jar:4.5.6:compile [INFO] | | | - (org.apache.httpcomponents:httpclient:jar:4.5.6:compile - omitted for duplicate) [INFO] | | - org.apache.httpcomponents:fluent-hc:jar:4.5.6:compile [INFO] | | - (org.apache.httpcomponents:httpclient:jar:4.5.6:compile - omitted for duplicate) [INFO] | +- org.apache.httpcomponents:httpcore-osgi:jar:4.4.10:compile [INFO] | | +- org.apache.httpcomponents:httpcore:jar:4.4.10:compile [INFO] | | - org.apache.httpcomponents:httpcore-nio:jar:4.4.10:compile [INFO] | | - (org.apache.httpcomponents:httpcore:jar:4.4.10:compile - omitted for duplicate) [INFO] | +- (org.slf4j:slf4j-api:jar:1.7.25:compile - omitted for conflict with 1.7.10) [INFO] | +- org.slf4j:jcl-over-slf4j:jar:1.7.25:runtime [INFO] | | - (org.slf4j:slf4j-api:jar:1.7.25:runtime - omitted for conflict with 1.7.10) [INFO] | - (commons-io:commons-io:jar:2.6:compile - omitted for conflict with 2.1) [INFO] +- org.semarglproject:semargl-sesame:jar:0.6.1:compile [INFO] | +- org.semarglproject:semargl-core:jar:0.6.1:compile [INFO] | +- org.semarglproject:semargl-rdfa:jar:0.6.1:compile [INFO] | | +- (org.semarglproject:semargl-core:jar:0.6.1:compile - omitted for duplicate) [INFO] | | - org.semarglproject:semargl-rdf:jar:0.6.1:compile [INFO] | | - (org.semarglproject:semargl-core:jar:0.6.1:compile - omitted for duplicate) [INFO] | - (org.openrdf.sesame:sesame-rio-api:jar:2.7.5:compile - omitted for conflict with 2.8.11) [INFO] - log4j:log4j:jar:1.2.17:compile

Suggested solutions:

Solution: Declare version com.fasterxml.jackson.core:jackson-core:2.9.6 as a direct dependency.

Thanks. Best regards, Coco

HelloCoCooo commented 3 years ago

@thompsonbry @beebs-systap Could please help me check this issue? May I pull a request to fix it? Thanks again.

beebs-systap commented 3 years ago

Sure, let me take a look.