[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[equinox-dev] Resolver Problem with guava and e4 (javax.annotation)


[cross posting because different projects are involved in the problem]

I've just discover a problem when one tries to use e4-DI and
com.google.guava 15.0.0.

The MANIFEST.MF is really simply:
> Manifest-Version: 1.0
> Bundle-ManifestVersion: 2
> Bundle-Name: Problem
> Bundle-SymbolicName: resolver.problem
> Bundle-Version: 1.0.0.qualifier
> Bundle-RequiredExecutionEnvironment: JavaSE-1.8
> Import-Package: javax.annotation;version="1.0.0"
> Require-Bundle: com.google.guava;bundle-version="15.0.0"

and when trying to resolve it one gets:
> resolver.problem [196]
>   Bundle was not resolved because of a uses contraint violation.
>   org.osgi.service.resolver.ResolutionException: Uses constraint violation. Unable to resolve resource resolver.problem [osgi.identity; osgi.identity="resolver.problem"; type="osgi.bundle"; version:Version="1.0.0.qualifier"] because it is exposed to package 'javax.annotation' from resources javax.annotation [osgi.identity; osgi.identity="javax.annotation"; type="osgi.bundle"; version:Version="1.2.0.v201401042248"] and org.eclipse.osgi [osgi.identity; osgi.identity="org.eclipse.osgi"; type="osgi.bundle"; version:Version="3.10.0.v20140528-2014"; singleton:="true"] via two dependency chains.
> Chain 1:
>   resolver.problem [osgi.identity; osgi.identity="resolver.problem"; type="osgi.bundle"; version:Version="1.0.0.qualifier"]
>     import: (&(osgi.wiring.package=javax.annotation)(version>=1.0.0))
>      |
>     export: osgi.wiring.package: javax.annotation
>   javax.annotation [osgi.identity; osgi.identity="javax.annotation"; type="osgi.bundle"; version:Version="1.2.0.v201401042248"]
> Chain 2:
>   resolver.problem [osgi.identity; osgi.identity="resolver.problem"; type="osgi.bundle"; version:Version="1.0.0.qualifier"]
>     require: (&(osgi.wiring.bundle=com.google.guava)(bundle-version>=15.0.0))
>      |
>     provide: osgi.wiring.bundle; bundle-version:Version="15.0.0.v201403281430"; osgi.wiring.bundle="com.google.guava"
>   com.google.guava [osgi.identity; osgi.identity="com.google.guava"; type="osgi.bundle"; version:Version="15.0.0.v201403281430"]
>     import: (osgi.wiring.package=javax.annotation)
>      |
>     export: osgi.wiring.package: javax.annotation
>   org.eclipse.osgi [osgi.identity; osgi.identity="org.eclipse.osgi"; type="osgi.bundle"; version:Version="3.10.0.v20140528-2014"; singleton:="true"]

The reason is that guava optionally imports:

Import-Package: javax.annotation;resolution:=optional,javax.inject;res

So guava wires to the package from the JDK and presents classes in its
API so I guess that's why the bundles who uses guava results in the
resolution conflict.

There are 2 possible solutions:
a) because we now require JavaSE-6 in all our e4 code we could remove
   the need for explicit javax.annotation imports - this would break
   existing code but is maybe the correct solution in the long run?

b) guava does import javax.annotation;1.0.0 instead