Search code examples
javageotoolsjscience

Class conflict on different dependencies


I have the same class on 2 dependencies on my project. The libraries unit-api-1.0 (which is a dependency of org.geotools) and jscience-4.3.1 both have the class javax.measure.quantity.Length.

 [INFO] +- org.geotools:gt-shapefile:jar:22.3:compile
 [INFO] |  +- org.geotools:gt-main:jar:22.3:compile
 [INFO] |  |  +- org.geotools:gt-referencing:jar:22.3:compile
 [INFO] |  |  |  +- org.ejml:ejml-ddense:jar:0.34:compile
 [INFO] |  |  |  |  \- org.ejml:ejml-core:jar:0.34:compile
 [INFO] |  |  |  +- commons-pool:commons-pool:jar:1.5.4:compile
 [INFO] |  |  |  +- org.geotools:gt-metadata:jar:22.3:compile
 [INFO] |  |  |  |  \- org.geotools:gt-opengis:jar:22.3:compile
 [INFO] |  |  |  |     \- systems.uom:systems-common-java8:jar:0.7.2:compile
 [INFO] |  |  |  |        +- tec.uom:uom-se:jar:1.0.8:compile
 [INFO] |  |  |  |        |  +- javax.measure:unit-api:jar:1.0:compile


 [INFO] \- org.jscience:jscience:jar:4.3.1:compile
 [INFO]    \- org.javolution:javolution:jar:5.2.3:compile

When I try to use Length to parameterize Measure, I get the error:

[ERROR]   error: type argument Length is not within bounds of type-variable Q
[ERROR]   where Q is a type-variable:
[ERROR]     Q extends Quantity declared in class Measure

Basically both interfaces Length extend the interface Quantity, as seen here:

https://www.javadoc.io/static/javax.measure/unit-api/1.0/javax/measure/quantity/Length.html http://jscience.org/api/javax/measure/quantity/Length.html

But one of them extends Quantity, while the other extends Quantity. Somehow, they are not compatible with each other and the compiler is using the wrong one and giving me this error.

It there a way to somehow manage this situation?


Solution

  • The GeoTools upgrade FAQ covers the changes needed to use Units after version 20.0.

    You need the following dependency:

    <dependency>
       <groupId>systems.uom</groupId>
       <artifactId>systems-common-java8</artifactId>
       <version>0.7.2</version>
    </dependency>
    

    and to make these changes:

    Package names have changed, resulting in some common search and replaces when upgrading:

    • Search javax.measure.unit.Unit replace javax.measure.Unit

    • Search ConversionException replace IncommensurableException

    This is a checked exception, in areas of the GeoTools library where this was found we now return an IllegalArgument exception.

    • Search converter == UnitConverter.IDENTITY replace converter.isIdentity()

    • Search javax.measure.unit.NonSI replace import si.uom.NonSI

    • Search javax.measure.unit.SI replace import si.uom.SI

    • Search SI.METER replace SI.METRE

    • Search javax.measure.converter.UnitConverter replace javax.measure.UnitConverter

    • Search javax.measure.unit.UnitFormat replace import javax.measure.format.UnitFormat

    • Search Unit.ONE replace AbstractUnit.ONE

    • Search Dimensionless.UNIT replace AbstractUnit.ONE

    • Search Unit.valueOf(unitString) replace Units.parseUnit(unitString)