PAGE2GO2 HOME | INTERNET NEWS

LeighExchange - Free Advertising Network Stock Research at Internet Speed Need Money Easy and Quick?

Re: Java ptolemy plot package.

 List
Subject: Re: Java ptolemy plot package.
Poster: Lewlew@nospam.lewscanon.com
Date: Fri, 23 Mar 2007 18:06:37 -0500
Related Postings: 1 2 3 4 5 6 7 8 9 10 11 12
mmcnurlin@usfamily.net wrote:
> [-- trimmed the part no longer relevant --]
> By messing around the CLASSPATH variable I got one of the compiler errors to
> go away. It knows where the package is, but I still can't instantiate the
> class.
>
> Here is the error:
>
> ""EasyPtPlot.java:21: cannot access Plot
> bad class file: c:\ptplot\Plot.class
> class file contains wrong class: ptolemy.plot.Plot
> Please remove or make sure it appears in the correct subdirectory of the
> classpath.
> Plot plotObj = new Plot();
> ^
> 1 error"

Welcome to the wonderful world of classpaths, packages and directories, which drove me away from Java the first time I tried to use it (in 1997 or so). Don't feel bad - it's genuinely wacky at first.

Long post follows. Or skip it and read the Sun tutorial. Or read it and read the Sun tutorial on packages.

Java breaks up classes into "packages" - groups of related classes. Each package has a dotted name sort of like object references, such as

package com.lewscanon.whoneedsstruts.dispatcher;

Notice that it looks an awful lot like a backwards URL; that's because that's what it is. This package belongs to the domain "lewscanon.com" at least fictionally, and within that domain it has a group of things named "whoneedsstruts" and another group of things called "whoneedsstruts.dispatcher".

Notice that the second one looks like it sort of belongs to the first. It does not. Despite the common element "com.lewscanon.whoneedsstruts" between them, the two packages are separate.

Every class that belongs to a package has a full name, the combination of the package and the class name, such as

com.lewscanon.whoneedsstruts.dispatcher.Dispatcher

This is a class 'Dispatcher' that belongs to the package 'com.lewscanon.whoneedsstruts.dispatcher'.

In a typical file system, each class is represented by a .class file, which perforce resides in a subdirectory of the file system. So somewhere on my hard drive I have this file 'Dispatcher.class' that has the bytecode for the 'Dispatcher' class. But in what subdirectory? Here the joy begins.

To help things along, Java loads classes from subdirectories that match package name parts exactly, with each name part corresponding to another subdirectory level. So my package

com.lewscanon.whoneedsstruts.dispatcher

has a subdirectory with the relative path

com/lewscanon/whoneedsstruts/dispatcher/

in which we find a file 'Dispatcher.class'.

Notice that I did not put a leading '/' in that path - it is relative to some parent directory. Let's say that I put all my Java applications inside the directory

/opt/apps/

Then the full pathname to the class file is

/opt/apps/com/lewscanon/whoneedsstruts/dispatcher/Dispatcher.class

See how the directory parts match the package parts?

But how does Java know to start at /opt/apps? By the classpath. You found out that the CLASSPATH environment variable can help, but that is a global and somewhat inflexible solution. More useful is a parameter '-cp' ('-classpath') to the 'java' command:

java -cp /opt/apps com.lewscanon.whoneedsstruts.dispatcher.Dispatcher

Notice that I told 'java' a fully-qualified class name, with dots not slashes. This is a class name, not a file name, so it is "package.Class", not "path/Class.class". The '-cp' option did use slashes, because its argument is a path.

A path can hold many directories, separated by ':' in UNIX, ';' in Windows.

java -cp /opt/apps:/var/moreapps com.lewscanon.whoneedsstruts.dispatcher.Dispatcher

(Ignore line wrapping caused by the newsgroup)

If the relative path cannot be found in /opt/apps/, 'java' will look in '/var/moreapps' to find the class file.

Your error message complained because you gave a classpath all the way down to the bottom directory, sort of like trying to say

java -cp /opt/apps/com/lewscanon/whoneedsstruts/dispatcher ...

The problem there is that the package is

com.lewscanon.whoneedsstruts.dispatcher

which would be several directories further down than exist. Your situation is similar. You have a class 'ptolemy.plot.Plot' which has to be in the directory

ptolemy/plot/

below a part of your classpath. If your classpath goes all the way down to c:/ptolemy/plot/, then the class would need to be in

c:/ptolemy/plot/ptolemy/plot/Plot.class

Instead, try

java -cp c:/ ptolemy.plot.Plot

Read Sun's tutorial.

-- Lew

 

Page2Go2.com is not responsible for content of this message.