Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #22980 > unrolled thread

help: class conflict in two different version JAR files

Started byzyng <xsli2@yahoo.com>
First post2013-03-20 07:34 -0700
Last post2013-03-20 20:32 -0700
Articles 6 — 4 participants

Back to article view | Back to comp.lang.java.programmer


Contents

  help: class conflict in two different version JAR files zyng <xsli2@yahoo.com> - 2013-03-20 07:34 -0700
    Re: help: class conflict in two different version JAR files zyng <xsli2@yahoo.com> - 2013-03-20 07:50 -0700
      Re: help: class conflict in two different version JAR files Lew <lewbloch@gmail.com> - 2013-03-20 12:16 -0700
    Re: help: class conflict in two different version JAR files Lew <lewbloch@gmail.com> - 2013-03-20 12:14 -0700
    Re: help: class conflict in two different version JAR files Arne Vajhøj <arne@vajhoej.dk> - 2013-03-20 22:11 -0400
    Re: help: class conflict in two different version JAR files Roedy Green <see_website@mindprod.com.invalid> - 2013-03-20 20:32 -0700

#22980 — help: class conflict in two different version JAR files

Fromzyng <xsli2@yahoo.com>
Date2013-03-20 07:34 -0700
Subjecthelp: class conflict in two different version JAR files
Message-ID<3ef61613-19c4-42d5-a9bb-82c2d9b4b8cd@googlegroups.com>
I am using Eclipse. Project A uses 3rdparty.1.0.1.jar file; Project B uses 3rdparty.1.0.3.jar file. Project B depends on Project A.

I am working on Project B. I am not supposed to change anything in Project A. I hope that the code in B always use the class inside 3rdparty.1.0.3.jar. I don't know how to do that. I found that for the classes in 3rdpartyxx.jar, the code in B just use the class in 3rdparty.1.0.1.jar file, which is used by A. I guess since B depends on A, so 3rdparty.1.0.1.jar file has the higher priority. This causes some problem, which I just omit here.

If running by ANT on the command line, due to the way I set up(project A's code listed near the end of the Java classpath), the code in B uses the classes in 3rdparty.1.0.3.jar and the problem was avoided.

I hope to solve the problem in Eclipse. Thank you for your help.

[toc] | [next] | [standalone]


#22981

Fromzyng <xsli2@yahoo.com>
Date2013-03-20 07:50 -0700
Message-ID<e81af975-00ad-4f92-9c47-443d11c05b60@googlegroups.com>
In reply to#22980
On Wednesday, March 20, 2013 10:34:47 AM UTC-4, zyng wrote:
> I am using Eclipse. Project A uses 3rdparty.1.0.1.jar file; Project B uses 3rdparty.1.0.3.jar file. Project B depends on Project A.
> 
> 
> 
> I am working on Project B. I am not supposed to change anything in Project A. I hope that the code in B always use the class inside 3rdparty.1.0.3.jar. I don't know how to do that. I found that for the classes in 3rdpartyxx.jar, the code in B just use the class in 3rdparty.1.0.1.jar file, which is used by A. I guess since B depends on A, so 3rdparty.1.0.1.jar file has the higher priority. This causes some problem, which I just omit here.
> 
> 
> 
> If running by ANT on the command line, due to the way I set up(project A's code listed near the end of the Java classpath), the code in B uses the classes in 3rdparty.1.0.3.jar and the problem was avoided.
> 
> 
> 
> I hope to solve the problem in Eclipse. Thank you for your help.

Another thing I am unclear is that: in the code in Project B, in Eclipse, when I press F3 on one of the class names, it says no source attached in 3rdparty.1.0.3.jar, giving me the impression that the code is using the classes in 3rdparty.1.0.3.jar. However, when running, the code is definitely using the classes in 3rdparty.1.0.1.jar, not 3rdparty.1.0.3.jar. 

For example: In Eclipse, if I remove 3rdparty.1.0.1.jar from Project A's build path, some code of A has compiling errors. But it does not matter for this testing purpose. Now, if I run my JUNit test code in Project B, the correct classes are used and the problem was avoided.

[toc] | [prev] | [next] | [standalone]


#22988

FromLew <lewbloch@gmail.com>
Date2013-03-20 12:16 -0700
Message-ID<7c205d0c-4a01-4fc8-b2f7-c1a151c73987@googlegroups.com>
In reply to#22981
zyng wrote:
> For example: In Eclipse, if I remove 3rdparty.1.0.1.jar from Project A's build path, some code 

Did you remember to put version 1.0.3 in Project A's build path?

> of A has compiling errors. But it does not matter for this testing purpose. Now, if I run my 
> JUNit test code in Project B, the correct classes are used and the problem was avoided.

Project A should not have trouble using a more recent version of the JAR.

-- 
Lew

[toc] | [prev] | [next] | [standalone]


#22987

FromLew <lewbloch@gmail.com>
Date2013-03-20 12:14 -0700
Message-ID<4ccc8333-ce6f-41ab-ab37-dc45c6d93a80@googlegroups.com>
In reply to#22980
zyng wrote:
> I am using Eclipse. Project A uses 3rdparty.1.0.1.jar file; Project B uses 3rdparty.1.0.3.jar file. 
> Project B depends on Project A.

Advice #1: Build your project using Ant and command-line tools. That will help you understand 
what Eclipse is doing.

> I am working on Project B. I am not supposed to change anything in Project A. I hope that the code in 

Ideally Project A will come to Project B as a JAR, e.g., "projectA.jar".

> B always use the class inside 3rdparty.1.0.3.jar. I don't know how to do that. I found that for the 

This is not really the way to look at it. One moment ...

> classes in 3rdpartyxx.jar, the code in B just use the class in 3rdparty.1.0.1.jar file, which is used by A. 

That is because both JARs are in your classpath.


>I guess since B depends on A, so 3rdparty.1.0.1.jar file has the higher priority. 

That is not correct.

It is because "3rdparty.1.0.1.jar" is ahead of "3rdparty.1.0.3.jar" in the classpath.

Just remove "3rdparty.1.0.1.jar" from the classpath.

> This causes some problem, which I just omit here.

Problems that the Project B cannot compile because it uses a newer version of "3rdparty".

But of course.

Unless "3rdparty" really screwed up backwards compatibility, remove the old version from 
the classpath.

Otherwise, put Project A after "3rdparty.1.0.3.jar" in your classpath for Project B.

> If running by ANT on the command line, due to the way I set up(project A's code listed near the end 
> of the Java classpath), the code in B uses the classes in 3rdparty.1.0.3.jar and the problem was avoided.

Read up on classpaths.

> I hope to solve the problem in Eclipse. Thank you for your help.

Have Eclipse use the Ant build.xml.

-- 
Lew

[toc] | [prev] | [next] | [standalone]


#23005

FromArne Vajhøj <arne@vajhoej.dk>
Date2013-03-20 22:11 -0400
Message-ID<514a6c39$0$32110$14726298@news.sunsite.dk>
In reply to#22980
On 3/20/2013 10:34 AM, zyng wrote:
> I am using Eclipse. Project A uses 3rdparty.1.0.1.jar file; Project B
> uses 3rdparty.1.0.3.jar file. Project B depends on Project A.
>
> I am working on Project B. I am not supposed to change anything in
> Project A. I hope that the code in B always use the class inside
> 3rdparty.1.0.3.jar. I don't know how to do that. I found that for the
> classes in 3rdpartyxx.jar, the code in B just use the class in
> 3rdparty.1.0.1.jar file, which is used by A. I guess since B depends
> on A, so 3rdparty.1.0.1.jar file has the higher priority. This causes
> some problem, which I just omit here.
>
> If running by ANT on the command line, due to the way I set
> up(project A's code listed near the end of the Java classpath), the
> code in B uses the classes in 3rdparty.1.0.3.jar and the problem was
> avoided.

This can be a tricky problem.

The easy and practical solution is to try and run with a.jar b.jar and
3rdparty.1.0.3.jar.

In many/most cases it will work because 1 version 1.0.3 should be
compatible with version 1.0.1.

If it does not then you will need to make changes so that
a.jar and 3rdparty.1.0.1.jar are loaded by one classloader and
b.jar and 3rdparty.1.0.3.jar are loaded by another classloader.

That is possible, but will require some coding.

I suggest that you try the easy approach first.

Arne

[toc] | [prev] | [next] | [standalone]


#23008

FromRoedy Green <see_website@mindprod.com.invalid>
Date2013-03-20 20:32 -0700
Message-ID<3mvkk8puju5qbd2t8tn3870j6viajk58lh@4ax.com>
In reply to#22980
On Wed, 20 Mar 2013 07:34:47 -0700 (PDT), zyng <xsli2@yahoo.com>
wrote, quoted or indirectly quoted someone who said :

>I am using Eclipse. Project A uses 3rdparty.1.0.1.jar file; Project B uses 3rdparty.1.0.3.jar file. Project B depends on Project A.
>
>I am working on Project B. I am not supposed to change anything in Project A. I hope that the code in B always use the class inside 3rdparty.1.0.3.jar. I don't know how to do that. I found that for the classes in 3rdpartyxx.jar, the code in B just use the class in 3rdparty.1.0.1.jar file, which is used by A. I guess since B depends on A, so 3rdparty.1.0.1.jar file has the higher priority. This causes some problem, which I just omit here.
>
>If running by ANT on the command line, due to the way I set up(project A's code listed near the end of the Java classpath), the code in B uses the classes in 3rdparty.1.0.3.jar and the problem was avoided.
>
>I hope to solve the problem in Eclipse. Thank you for your help.

If the authors did this properly, all you need to do is hide the 1.0.1
jar, get in off the classpath, out of the ext dirs, and all should
work.  At run time Java looks for matching class files.

If it does not, you will have to recompile Project A, and modify it
slightly to use the new jar, e.g. a renamed class.

-- 
Roedy Green Canadian Mind Products http://mindprod.com
Every method you use to prevent or find bugs leaves a residue of subtler 
bugs against which those methods are ineffectual. 
 ~ Bruce Beizer  Pesticide Paradox

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.programmer


csiph-web