My recommendations are this:

Provide an artifact called phoenix-client-shaded that is a shaded a jar.

Refactor the current phoenix-client-shaded into a plain ordinary maven project 
in which any standard based JSR api (such as servlet, xml) are provided scope.  
The rest of the dependencies are compile scope. Punish it in a maven repository.



> On Sep 15, 2016, at 11:09 PM, Marco Villalobos <mvillalo...@kineteque.com> 
> wrote:
> 
> TL;DR; Publish a non-shaded version of phoenix client to a maven repository 
> because it would much easier for complex systems to utilize since it is meant 
> to be used as a library.
> 
> I'll elaborate, because both approaches have their benefits when done 
> correctly. 
> 
> I want to constructively say that it was not done correctly in this project.
> 
> CURRENTLY
> 
> Currently, the phoenix-client jar is shaded and it only repackages (changes 
> the package name structure of dependencies) for some of its dependencies.
> Currently, the phoenix-client jar is NOT available in the most popular maven 
> repositories.
> 
> However, most organizations use a dependency management tool such as Maven, 
> Ivy, or Gradle. Typically, an organize simply declares an artifact as a 
> dependency.
> Their build system will then pull ALL the required dependencies and package 
> them in the proper location for an application.
> 
> WHAT IF CLIENT WAS PUBLISHED IN MAVEN REPOSITORY?
> 
> Now, let's say phoenix-client jar was published in a maven repository. 
> 
> FIRST BENEFIT
> 
> This would help the adoption rate since it would be easier for organizations 
> to integrate into their projects via dependency management.
> 
> BUT THERE ARE CLASS LOADING PROBLEMS BECAUSE IT SHADED
> 
> However, providing only a shaded jar has less benefit and utility, and in 
> fact, probably introduces a greater chance that it will be in conflict during 
> the runtime with class loading issues. 
> 
> If it was not shaded then all of those runtime class loading issues 
> disappear, and build tools such as maven could easily manage the required 
> dependencies.
> 
> If you listed the all of the non-phoenix packages in the phoenix client:
> 
> jar tvf phoenix-4.8.0-HBase-1.2-client.jar | awk '{if 
> (!match($8,/^org\/apache\/phoenix/)) {print $8}}' 
> 
> It would list these packages (a sample):
> 
> org/apache/hadoop/
> org/apache/hadoop/hbase/
> org/apache/tephra/
> com/google/gson/
> com/google/inject
> sqlline
> com/google/common
> com/google/protobuf
> org/apache/commons/logging
> org/apache/log4j/
> org/apache/htrace/
> org/apache/commons/csv
> javax/annotation/
> org/apache/hadoop/hbase/client/
> org/apache/hadoop/hbase/zookeeper/
> tables/
> org/apache/curator/
> com/sun/jersey/server
> javax/ws/
> com/sun/appserv/
> com/sun/el/parser
> javax/servlet/
> org/owasp/esapi
> bsh/
> org/apache/batik
> org/w3c/dom/svg
> org/cyberneko/html/
> org/apache/hadoop/hdfs
> org/apache/xerces/
> javax/xml/
> org/w3c/dom
> org/xml/sax
> com/sun/jersey/json
> com/sun/xml/bind/
> org/slf4j/impl/
> javax/activation
> com/sun/jersey/api/client/
> com/google/inject
> org/apache/flume
> org/apache/pig/
> 
> That listing alone would prevent a person from using the client that has a 
> different version of Servlet, Guava, Protocol Buffers, Jersey (jax-rs), 
> SLF-4j, Jersey Client.
> 
> Those are some of the most useful popular libraries available to the public.
> 
> Now let's say that it was shaded properly.  There could still be some 
> problems in certain environments, such as one that uses JAX-RS because 
> classes that were annotated with @Provider would be loaded during a web 
> application!
> 
> So really, this brings us back to square one.  An unshaded version of the 
> client should be made available so that users can just declare it as a maven 
> dependency.
> 
> THE BENEFITS OF A SHADED JAR
> 
> Now, there are a few benefits to providing a shaded jar:
> 
> It is easier to MANUALLY install on a system that has NONE of the 
> dependencies that are shaded into it.
> 
> Its okay to to provide shaded jars for executable applications.
> 
> REBUTTAL
> 
> Most systems use Maven for dependency management.  Phoenix client is not an 
> application, it is a library.
> 
> CONCLUSION
> 
> I killed this, didn't I?  I hope my point is taken that a non-shaded version 
> of the client should be provided by now. And a more complete effort to 
> repackage its dependencies completely should be taken.
> 
> Libraries should never shaded jars.  
> 
> 
>> On Sep 15, 2016, at 1:10 PM, Nick Dimiduk <ndimi...@gmail.com> wrote:
>> 
>> So how is no shading better than this partial shading? You'd end up with
>> the same conflicts, no?
>> 
>> As far as I know, a JDBC implementation exposes nothing outside java.sql.*.
>> Anything else exposed by the shaded jar is probably a bug. Can you provide
>> more details on what you're seeing, or -- better still -- file a JIRA?
>> 
>> On Thu, Sep 15, 2016 at 11:45 AM, Marco Villalobos <
>> mvillalo...@kineteque.com> wrote:
>> 
>>> Not all of its dependencies are repackaged though, which leads to
>>> class loading conflicts.  When is that ever a good thing?
>>> 
>>> On Thu, Sep 15, 2016 at 9:28 AM, Nick Dimiduk <ndimi...@gmail.com> wrote:
>>>> Maybe I'm missing something, but...
>>>> 
>>>> The whole point of providing a shaded client jar is to prevent exposing
>>>> Phoenix implementation details to the applications that consume it --
>>>> effectively allowing people to manage their own dependencies. Using a
>>>> shaded client jar means you don't have to worry about dependency conflict
>>>> because by definition there's only one dependency: the shaded client.
>>> What
>>>> are you able to achieve now with, say, the 4.7.0 unshaded client that you
>>>> cannot with the new 4.8.0 shaded client?
>>>> 
>>>> Thanks for the explanation.
>>>> -n
>>>> 
>>>> On Thu, Sep 15, 2016 at 7:56 AM, Marco Villalobos <
>>> mvillalo...@kineteque.com
>>>>> wrote:
>>>> 
>>>>> Good morning.
>>>>> 
>>>>> I want to provide a module that provides the unshaded version of the
>>> jdbc
>>>>> client.
>>>>> 
>>>>> This will allow people to manage their own dependencies without worry of
>>>>> conflict.
>>>>> 
>>>>> -Marco.
>>>>> 
>>>>> 
>>>>> 
>>> 
> 

Reply via email to