Hi, tien
I think I have understood what you're talking about.
The issue occurred because one of your third-party dependencies DECLAREs that
it requires `dubbo-serialization-kryo`. right?
The best solution is that you can just add `<exclude />` lines in the section
of that third-party dependency for `dubbo-serialization-kryo` and everything
will go fine.
Still `dubbo` is combined of many smaller dubbo modules including
`dubbo-serialization` as shown below:
==========================
jason-mbp:wav hblzxsj$ unzip -Z dubbo-serialization-kryo-2.7.4.jar |awk
'{print $9}' |grep class$
org/apache/dubbo/common/serialize/kryo/KryoObjectInput.class
org/apache/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.class
org/apache/dubbo/common/serialize/kryo/KryoSerialization.class
org/apache/dubbo/common/serialize/kryo/CompatibleKryo.class
org/apache/dubbo/common/serialize/kryo/utils/PooledKryoFactory.class
org/apache/dubbo/common/serialize/kryo/KryoObjectOutput.class
org/apache/dubbo/common/serialize/kryo/utils/ThreadLocalKryoFactory$1.class
org/apache/dubbo/common/serialize/kryo/utils/PrototypeKryoFactory.class
org/apache/dubbo/common/serialize/kryo/utils/ReflectionUtils.class
org/apache/dubbo/common/serialize/kryo/utils/KryoUtils.class
org/apache/dubbo/common/serialize/kryo/utils/ThreadLocalKryoFactory.class
=======================
So when you don't have a `dubbo` dependency in your project you need
`dubbo-serialization-kryo` but if so just ignore it.
best regards,
Jason
> On Oct 25, 2019, at 23:11, Tien Dat PHAN <[email protected]> wrote:
>
> Hi Jason,
>
> I really appreciate your attention on this issue.
>
> As we have described, the duplicate class error is popped up when we declare
> both dependency on dubbo and dubbo-serialization-kryo (as we need third-party
> dependencies required by dubbo-serialization-kryo):
> <dependency>
> <groupId>org.apache.dubbo</groupId>
> <artifactId>dubbo</artifactId>
> <version>${dubbo.version}</version>
> <exclusions>
> <exclusion>
> <groupId>com.apache.dubbo</groupId>
> <artifactId>dubbo-common</artifactId>
> </exclusion>
> </exclusions>
> </dependency>
> <dependency>
> <groupId>org.apache.dubbo</groupId>
> <artifactId>dubbo-serialization-kryo</artifactId>
> <version>${dubbo.version}</version>
> <exclusions>
> <exclusion>
> <groupId>com.apache.dubbo</groupId>
> <artifactId>dubbo-common</artifactId>
> </exclusion>
> </exclusions>
> </dependency>
>
> Of course, we can still avoid the "Duplicate class" ERROR by declaring
> dependency only on dubbo, plus the kryo library that dubbo-serialization-kryo
> uses:
> <dependency>
> <groupId>org.apache.dubbo</groupId>
> <artifactId>dubbo</artifactId>
> <version>${dubbo.version}</version>
> </dependency>
> <dependency>
> <groupId>com.esotericsoftware</groupId>
> <artifactId>kryo</artifactId>
> <version>4.0.1</version>
> </dependency>
>
> If you really need a project for quicker reproduction, I can make a github
> project. The content will most likely just these poms.
>
> Best
> Tien Dat
>
> On 2019/10/25 13:13:29, Jason Joo <[email protected]> wrote:
>> Hi, tien,
>>
>> Err, I don't think the error message of duplicated class is a normal thing,
>> could you upload a sample to reproduce it?
>>
>> best regards,
>>
>> Jason
>>
>>> On Oct 25, 2019, at 19:15, Tien Dat PHAN <[email protected]> wrote:
>>>
>>> Hi Jason,
>>>
>>> Thanks for asking. Everything is working if we add this directly.
>>> And we understand your concern about having conflicting dependencies with
>>> our application dependencies.
>>> And this is at the end a tradeoff between memory footprint optimization vs
>>> software project management efficiency.
>>>
>>> Our application does not need specifically com.esotericsoftware.kryo. This
>>> is needed only by org.apache.dubbo:dubbo-serialization-kryo. And we really
>>> don't like the fact that we need to repeat the dependency declaration on
>>> this library, which is already defined by
>>> org.apache.dubbo:dubbo-serialization-kryo, but got ignored. Moreover, if we
>>> upgrade Dubbo version, we have to go check the new version of
>>> com.esotericsoftware.kryo used by the new Dubbo, and update it accordingly.
>>>
>>> At the end, I think we will accept the ERROR message on "Duplicate class".
>>> As their is no win-win solution for this case.
>>>
>>> Best regards
>>> Dat
>>>
>>> On 2019/10/25 10:47:32, Jason Joo <[email protected]> wrote:
>>>> Tien,
>>>>
>>>> It makes sense because it (and others like this) is an optional extension
>>>> / support / function. We should decide to introduce the extra dependencies
>>>> it requires when we enable it in configuration compared to the default.
>>>> Another similar thing is that which driver you should introduce among
>>>> zookeeper / nacos / redis / others depends which implementation of
>>>> registry you want to use and actually config.
>>>>
>>>> In most cases the version may not matter so much but you'd better to pick
>>>> it carefully to match just or newer to the version dubbo uses by default.
>>>>
>>>> So is everything going well now? After introducing the necessary
>>>> dependencies?
>>>>
>>>> best regards,
>>>>
>>>> Jason
>>>>
>>>>> On Oct 25, 2019, at 18:19, Tien Dat PHAN <[email protected]> wrote:
>>>>>
>>>>> Hi Jason,
>>>>>
>>>>> The org.apache.dubbo:dubbo-serialization-kryo, for example, needs
>>>>> com.esotericsoftware.kryo.Kryo for Kryo serialization.
>>>>>
>>>>> org.apache.dubbo:dubbo-serialization-kryo itself has it declared in
>>>>> pom.xml
>>>>>
>>>>> But you do "unzip -Z dubbo-2.7.3.jar |awk '{print $9}' |grep kryo", you
>>>>> don't see it included.
>>>>> And we have to declare it directly in our application pom.xml
>>>>> We believe that this is not relevant, since we have to update the version
>>>>> of com.esotericsoftware.kryo according to
>>>>> org.apache.dubbo:dubbo-serialization-kryo.
>>>>>
>>>>> Best
>>>>> Dat
>>>>>
>>>>> On 2019/10/25 08:17:18, Jason Joo <[email protected]> wrote:
>>>>>> Hi, tien
>>>>>>
>>>>>> `dubbo` is a "fat" jar which includes all the classes you may possibly
>>>>>> use.
>>>>>>
>>>>>> You can confirm it using "unzip" as shown below:
>>>>>>
>>>>>>
>>>>>> bogon:2.7.3 hblzxsj$ unzip -Z dubbo-2.7.3.jar |awk '{print $9}' |grep
>>>>>> kryo
>>>>>> org/apache/dubbo/common/serialize/kryo/
>>>>>> org/apache/dubbo/common/serialize/kryo/KryoObjectInput.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.class
>>>>>> org/apache/dubbo/common/serialize/kryo/KryoSerialization.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/PooledKryoFactory.class
>>>>>> META-INF/maven/org.apache.dubbo/dubbo-serialization-kryo/
>>>>>> META-INF/maven/org.apache.dubbo/dubbo-serialization-kryo/pom.properties
>>>>>> org/apache/dubbo/common/serialize/kryo/CompatibleKryo.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/ThreadLocalKryoFactory$1.class
>>>>>> org/apache/dubbo/common/serialize/kryo/KryoObjectOutput.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/PrototypeKryoFactory.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/ReflectionUtils.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/KryoUtils.class
>>>>>> org/apache/dubbo/common/serialize/kryo/utils/ThreadLocalKryoFactory.class
>>>>>> META-INF/maven/org.apache.dubbo/dubbo-serialization-kryo/pom.xml
>>>>>>
>>>>>>
>>>>>>
>>>>>> best regards,
>>>>>>
>>>>>> Jason
>>>>>>
>>>>>>> On Oct 25, 2019, at 16:06, Tien Dat PHAN <[email protected]> wrote:
>>>>>>>
>>>>>>> Hi Jason,
>>>>>>>
>>>>>>> We found that is not enough.
>>>>>>> As you have pointed out the dependency on
>>>>>>> `http://repo1.maven.org/maven2/org/apache/dubbo/`
>>>>>>> All dependencies wrapped by org.apache.dubbo:dubbo are marked as
>>>>>>> optional.
>>>>>>> This means on our application pom.xml, we have to declare the libraries
>>>>>>> that we need directly, as they are not brought directly from
>>>>>>> org.apache.dubbo:dubbo dependencies (check
>>>>>>> `https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html`)
>>>>>>>
>>>>>>> Best
>>>>>>> Dat
>>>>>>>
>>>>>>> On 2019/10/25 01:48:29, Jason Joo <[email protected]> wrote:
>>>>>>>> Hi, tien
>>>>>>>>
>>>>>>>> There is a problem in your `dependencies` section.
>>>>>>>> `dubbo` is a single package including all codes related dubbo core
>>>>>>>> like `netty-all` while `dubbo-serialization-kryo` is already included
>>>>>>>> in `dubbo`.
>>>>>>>>
>>>>>>>> If you want to do some customizing like removing some useless support
>>>>>>>> in `dubbo` you could use another way to introduce the dependencies
>>>>>>>> like: dubbo-common, dubbo-cluster and etc. .
>>>>>>>>
>>>>>>>> Certainly it will be so complicated because there are so many packages
>>>>>>>> to decide which are required to be introduced and you can see the full
>>>>>>>> list in `http://repo1.maven.org/maven2/org/apache/dubbo/`
>>>>>>>> <http://repo1.maven.org/maven2/org/apache/dubbo/%60>.
>>>>>>>>
>>>>>>>> So generally we just introduce `dubbo` instead. That's already enough.
>>>>>>>>
>>>>>>>> best regards,
>>>>>>>>
>>>>>>>> Jason
>>>>>>>>
>>>>>>>>> On Oct 25, 2019, at 00:31, Tien Dat PHAN <[email protected]> wrote:
>>>>>>>>>
>>>>>>>>> the dubbo-common library as the suggestion with the help o
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>
>>>>
>>
>>