I'm refactoring some code. It is analogous to this:
- Code: Select all
// Monolithic/Dynamic.java
import lejos.nxt.Button;
public class Dynamic extends Static {
public static void main (String[] args) {
System.out.println("Hello World");
Button.waitForAnyPress();
}
private UsefulClass uc;
}
class Static { }
class UsefulClass { }
I compile and link it by running:
- Code: Select all
nxjc Dynamic.java
nxjlink -o out.nxj Dynamic
And afterwards, I have the files:
Dynamic.class
Static.class
out.nxj
Dynamic.java
UsefulClass.class
in the directory.
Now, this is messy. (Believe me!) The dynamic class changes, but the other classes it depends upon do not. I'd like to put them into a .jar file, and link against it.
Here are the files I will create in an attempt to do that:
BaseDirectory/MyPackage/Static.java
BaseDirectory/MyPackage/UsefulClass.java
BaseDirectory/Elsewhere/Dynamic.java
The files to go in the package are as follows:
- Code: Select all
// MyPackage/Static.java
package MyPackage;
public class Static { }
- Code: Select all
// MyPackage/UsefulClass.java
package MyPackage;
public class UsefulClass { }
I go into the BaseDirectory and create a library as follows:
- Code: Select all
nxjc MyPackage/*.java
jar cvf MyPackage.jar MyPackage/*.class
Now I have:
BaseDirectory/MyPackage/Static.class
BaseDirectory/MyPackage/Static.java
BaseDirectory/MyPackage/UsefulClass.class
BaseDirectory/MyPackage/UsefulClass.java
BaseDirectory/MyPackage.jar
Finally, I create the dynamic class, in BaseDirectory/Elsewhere/Dynamic.java. (I'm hoping that this file can be anywhere, so long as it can access the .jar library file):
- Code: Select all
// Elsewhere/Dynamic.java
import lejos.nxt.Button;
import MyPackage.*;
public class Dynamic extends Static {
public static void main (String[] args) {
System.out.println("Hello World");
Button.waitForAnyPress();
}
private UsefulClass uc;
}
I go into Elsewhere, and compile it:
- Code: Select all
nxjc -cp ../MyPackage.jar Dynamic.java
Great. Now I try to link it, like this:
- Code: Select all
nxjlink -o out.nxj -cp ../MyPackage.jar Dynamic
And get a bunch of error messages:
- Code: Select all
js.tinyvm.TinyVMException: Class Dynamic (file Dynamic.class) not found in CLASSPATH /Users/clinton/Development/Enchanting/EnchantingTrunk/ThirdParty/lejos_nxj/bin/../lib/nxt/classes.jar:../MyPackage.jar
at js.tinyvm.ClassRecord.getClassRecord(ClassRecord.java:855)
at js.tinyvm.Binary.processClasses(Binary.java:362)
at js.tinyvm.Binary.createFromClosureOf(Binary.java:309)
at js.tinyvm.TinyVMTool.link(TinyVMTool.java:97)
at js.tinyvm.TinyVMTool.link(TinyVMTool.java:48)
at lejos.pc.tools.NXJLink.start(NXJLink.java:134)
at lejos.pc.tools.NXJLink.run(NXJLink.java:101)
at lejos.pc.tools.NXJLink.start(NXJLink.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at lejos.pc.tools.ToolStarter.startTool(ToolStarter.java:31)
at lejos.pc.tools.NXJLink.main(NXJLink.java:28)
I've tried some variations, like this:
- Code: Select all
nxjlink -o out.nxj -cp ../MyPackage.jar -cp . Dynamic
Getting:
- Code: Select all
js.tinyvm.TinyVMException: Class MyPackage.Static (file MyPackage/Static.class) not found in CLASSPATH /Users/clinton/Development/Enchanting/EnchantingTrunk/ThirdParty/lejos_nxj/bin/../lib/nxt/classes.jar:.
at js.tinyvm.ClassRecord.getClassRecord(ClassRecord.java:855)
at ... ... ...
Clearly, I haven't quite got it yet. What is the proper command to link my dynamic java file against my custom library?
Thanks,
Clinton
