On 9/23/11 1:31 PM, Knut Anders Hatlen wrote:
On Fri, 2011-09-23 at 08:02 -0700, Rick Hillegas wrote:
On 9/23/11 7:26 AM, Katherine Marsden wrote:
I don't have Internet connectivity from my computer but hit a serious problem 
with mixed jars trying to test 10.8 client      with 10.5 server that I wanted 
to share as I will likely be disconnected until Monday.

If I have 10.8 derbyclient.jar followed by 10.5 derbyrun.jar  in my classpath 
and try to make even an embedded connection, I get a NoSuchFieldError for 
JVMInfo.JAVA_SQL_TYPES_BOOLEAN.

This field was  required for 10.5 but removed sometime before 10.8.
Hi Kathey,

That field was needed to support JDK 1.3. The field was removed in 10.7
by the work onhttps://issues.apache.org/jira/browse/DERBY-4868.

JVMInfo is one of the classes which is included in multiple Derby jar
files: derby.jar, derbyclient.jar, derbytools.jar. References to JVMInfo
will be resolved in a way which depends on the order of your classpath.
Assumptions about the behavior of the shared classes appear to me to be
brittle, poorly tested, and poorly documented.
I agree. It sounds like the problem is that the client and the engine
share the JVMInfo class, not that we modify the class. Any changes to
that class could cause problems in such mixed setups. If we add
fields/methods, it would be problematic to have the old version first in
the classpath (as seen in DERBY-5429). If we remove fields/methods, it
would be problematic with the new version first (as seen in this
thread). Not to mention what happens if the value of a field, or the
implementation of a method, changes between two versions.

The rule we have followed so far, has been that only interfaces that
contain constants only, can be present in more than one jar file. (An
exception was made for the sanity classes, since they'll only be in the
debug jars, which was thought to be less serious.) So JVMInfo shouldn't
be used by the client according to that rule.

But even if we fix this on trunk so that the client doesn't use that
class, there could still be collisions between old clients and new
engines (but not the other way around), unless we also rename the
JVMInfo class on trunk.

We have a similar problem with other classes in the same package:

ProductVersionHolder
Version

The remaining class in that package (PropertyNames) should not cause problems as long as it just holds constants.

We might be able to fix this brittleness by cloning eveything in this package into separate *Client, *Engine, and *Tools versions:

1) Rename all of these files to have a .shr extension rather than .java.

2) Write a simple-minded ant task which does the following:

a) Constructs a list $L of all the files in the package which end with the .shr extension.

b) For each of the files, create a separate *Client, *Engine, and *Tools version. For instance, Version.shr would be cloned into VersionClient.java, VersionEngine.java, and VersionTools.java. The clones would be written into the generated source tree of the build.

c) In each of the clones, for each name $N in $L, we would replace $N with the appropriate $NClient, $NEngine, or $NTools string.

3) The references to each of these classes across the rest of the code would have to be changed to references to the appropriate clone.

Thanks,
-Rick


Reply via email to