[ 
https://issues.apache.org/jira/browse/JCLOUDS-1225?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15856410#comment-15856410
 ] 

Ian Springer commented on JCLOUDS-1225:
---------------------------------------

[~tpeierls], +1. 

I just spent 3 hours trying to go the self-shaded jclouds route, and hit the 
following issues along the way:

1. A complicated shade plugin config was necessary in order to pull jclouds and 
its deps in, but not other things like JDK classes...

{code}
<plugin>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <id>shade</id>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <relocations>
            <relocation>
                <shadedPattern>shaded.jclouds.</shadedPattern>
                <excludes>
                    <exclude>META-INF/**</exclude>
                    <exclude>java.**</exclude>
                    <exclude>javax.**</exclude>
                    <exclude>org.slf4j.**</exclude>
                    <exclude>com.google.inject.**</exclude>
                    <exclude>org.jclouds.**</exclude>
                </excludes>
            </relocation>
        </relocations>
        <transformers>
            <transformer 
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"
 />
        </transformers>
        <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
        <!-- TODO: Uncomment the below line once 
https://issues.apache.org/jira/browse/MSHADE-248 has been fixed. -->
        <!--<createSourcesJar>true</createSourcesJar>-->
    </configuration>
</plugin>
{code}

2. The 5 or 6 jclouds deps that various modules in my project depend on all had 
to be moved to the new jclouds-shaded module, rather than being explicitly 
declared in the modules depending on them.

3. In modules depending on the new jclouds-shaded jar, I had to do the 
following hack in order to prevent the original jclouds jars and their 
transitive deps from getting pulled into the reactor:

{code}
<dependency>
    <groupId>com.evergage.infrastructure</groupId>
    <artifactId>jclouds-shaded</artifactId>
    <version>${jclouds.version}</version>
    <!-- jclouds relocated transitive deps are bundled in the shaded jar, so 
exclude all transitive deps to
         avoid pulling in the original packages -->
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
{code}

4. I had to exclude the jclouds-shaded module from the reactor, otherwise it 
broke IntelliJ, because it doesn't support processing shade config relocations:

{code}
<modules>
        <!-- NOTE: The below module must be excluded from the Maven reactor, 
otherwise IntelliJ will get confused
                   (see https://youtrack.jetbrains.com/issue/IDEA-126596). -->
        <!--<module>jclouds-shaded</module>-->
{code}

And after all that, I get the following exception at runtime:

{code}
Caused by: java.util.ServiceConfigurationError: 
org.jclouds.providers.ProviderMetadata: Provider 
shaded.jclouds.orgshaded.jclouds..shaded.jclouds.jcloudsshaded.jclouds..shaded.jclouds.gogridshaded.jclouds..shaded.jclouds.GoGridProviderMetadatashaded.jclouds.
 not found
        at java.util.ServiceLoader.fail(ServiceLoader.java:239) ~[na:1.8.0_121]
        at java.util.ServiceLoader.access$300(ServiceLoader.java:185) 
~[na:1.8.0_121]
        at 
java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:372) 
~[na:1.8.0_121]
        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) 
~[na:1.8.0_121]
        at java.util.ServiceLoader$1.next(ServiceLoader.java:480) 
~[na:1.8.0_121]
        at 
shaded.jclouds.com.google.common.collect.ImmutableCollection$Builder.addAll(ImmutableCollection.java:281)
 ~[jclouds-shaded-2.0.0.jar:2.0.0]
        at 
shaded.jclouds.com.google.common.collect.ImmutableCollection$ArrayBasedBuilder.addAll(ImmutableCollection.java:360)
 ~[jclouds-shaded-2.0.0.jar:2.0.0]
        at 
shaded.jclouds.com.google.common.collect.ImmutableSet$Builder.addAll(ImmutableSet.java:508)
 ~[jclouds-shaded-2.0.0.jar:2.0.0]
        at org.jclouds.providers.Providers.all(Providers.java:83) 
~[jclouds-shaded-2.0.0.jar:2.0.0]
        at org.jclouds.providers.Providers.withId(Providers.java:99) 
~[jclouds-shaded-2.0.0.jar:2.0.0]
        at org.jclouds.ContextBuilder.newBuilder(ContextBuilder.java:167) 
~[jclouds-shaded-2.0.0.jar:2.0.0]
        ... 49 common frames omitted
{code}

At this point, I've already wasted way too much time on this, so I'll be going 
back to my forked jclouds solution, which also took 3 hours, but at least it 
was working, and did not introduce lots of ugly complexity to my project's 
build.

I would strongly not recommend the shading route to anyone looking to use 
jclouds and Guava 21 in the same project.


> Guava 21 compatibility
> ----------------------
>
>                 Key: JCLOUDS-1225
>                 URL: https://issues.apache.org/jira/browse/JCLOUDS-1225
>             Project: jclouds
>          Issue Type: Improvement
>          Components: jclouds-core
>    Affects Versions: 2.0.0
>            Reporter: Ian Springer
>              Labels: guava
>
> The below classes use com.google.common.base.Objects.ToStringHelper, which 
> has been deprecated since Guava 18, and has been removed in Guava 21. This 
> makes it impossible to use jclouds in a project using Guava 21. Please either 
> upgrade to Guava 18+ and switch to using 
> com.google.common.base.MoreObjects.ToStringHelper, or drop the usage of 
> ToStringHelper altogether. This will allow my project to upgrade to Guava 21 
> without having to use a fork of jclouds.
> * org/jclouds/apis/internal/BaseApiMetadata.java
> * org/jclouds/domain/internal/LocationImpl.java
> * org/jclouds/domain/internal/MutableResourceMetadataImpl.java
> * org/jclouds/domain/internal/ResourceMetadataImpl.java
> * org/jclouds/http/HttpMessage.java
> * org/jclouds/http/HttpRequest.java
> * org/jclouds/http/HttpResponse.java
> * org/jclouds/internal/BaseView.java
> * org/jclouds/providers/internal/BaseProviderMetadata.java
> * org/jclouds/reflect/InvocationSuccess.java
> * org/jclouds/rest/internal/BaseHttpApiMetadata.java
> * org/jclouds/rest/suppliers/URIFromStringSupplier.java



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to