Modern Jass - design by contract für java

Dani87

Grünschnabel
Hi Leute,

ich schreibe derzeit eine Seminararbeit über design by contract. Eigentlich eine schöne Sache, wenn doch die vorhandenen Frameworks nicht so viele Probleme verursachen würden. Auf der englischen Artikelseite von DBC auf Wikipedia ist eine lange Liste von FWs die in Java zur Verfügung stehen. Ich habe mich für das FW "Modern Jass" entschieden, weil es eigentlich leicht umzusetzen ist.

Ich bin bei einem Ersten Test nach dieser Anleitung vorgegangen:

http://modernjass.sourceforge.net/gettingStarted.html

1. Die benötigte *.jar-Datei als externe Bib einbegunden.

2. Example Code kopiert und ausgeführt, funktioniert wunderbar.

3. per "javac -cp jass.modern.core-20070519.jar foo/Bar.java" kompiliert. Es wurden zwei Dateien erstellt, wie in der Doku beschrieben, funktioniert also auch wunderbar.

4. Jetzt sollte das Ganze mit dem Befehl "java -javaagent:jass.modern.core-20070519.jar foo.Bar" ausgeführt werden. Allerdings klappt das nicht. Das Ergebnis, welches normalerweise angezeigt werden sollte, sieht man auf der beschriebenen Seite (letzte Grafik).


Mein Ergebnis sieht allerdings so aus:

Code:
C:\Users\me\workspace\MJ\src>java -javaagent:jass.modern.core-20070519.jar foo.Bar 1 2 3
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)
        at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)
Caused by: java.lang.NullPointerException
        at jass.modern.core.compile.ContractJavaCompiler.<init>(ContractJavaCompiler.java:114)
        at jass.modern.core.compile.ContractJavaCompiler.getInstance(ContractJavaCompiler.java:151)
        at jass.modern.core.bytecode.contracts.ContractClassFileTransformer.<init>(ContractClassFileTransformer.java:51)

        at jass.modern.core.bytecode.PreMain.premain(PreMain.java:74)
        ... 6 more
FATAL ERROR in native method: processing of -javaagent failed



Kann mir jemand sagen, wodran es liegen könnte? Verwendet wird die aktuelle Java Version.

lg,
dani
 
Hallo,

du brauchst noch das tools.jar aus deinem JDK im Classpath...
Java:
package de.tutorials.dbc;

import jass.modern.Pre;
public class DBCExample {
    @Pre("args.length % 2 == 0")
    public static void main(String[] args) {
        System.out.println("Hello, " + args.length);
    }
}

...ohne tools.jar:
Code:
D:\workspaces\sts2.3.3M1\de.tutorials.training>java -javaagent:lib\jass.modern.core-20070519.jar -cp bin;lib\jass.modern.core-20070519.jar de.tutorials.dbc.DBCExample 1 2 3
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)
        at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)
Caused by: java.lang.NullPointerException
        at jass.modern.core.compile.ContractJavaCompiler.<init>(ContractJavaCompiler.java:114)
        at jass.modern.core.compile.ContractJavaCompiler.getInstance(ContractJavaCompiler.java:151)
        at jass.modern.core.bytecode.contracts.ContractClassFileTransformer.<init>(ContractClassFileTransformer.java:51)
        at jass.modern.core.bytecode.PreMain.premain(PreMain.java:74)
        ... 6 more
FATAL ERROR in native method: processing of -javaagent failed

Mit tools.jar:
Code:
D:\workspaces\sts2.3.3M1\de.tutorials.training>java -javaagent:lib\jass.modern.core-20070519.jar -cp bin;lib\jass.modern.core-20070519.jar;"C:\Program Files\Java\jdk1.6.0_20\lib\tools.jar" de.tutorials.dbc.DBCExample 1 3 4
Exception in thread "main" jass.modern.core.PreConditionError: [args.length % 2 == 0]
        at de.tutorials.dbc.DBCExample.main(DBCExample.java:9)

Code:
D:\workspaces\sts2.3.3M1\de.tutorials.training>java -javaagent:lib\jass.modern.core-20070519.jar -cp bin;lib\jass.modern.core-20070519.jar;"C:\Program Files\Java\jdk1.6.0_20\lib\tools.jar" de.tutorials.dbc.DBCExample 1 3
Hello, 2

Gruß Tom
 
Hi Thomas,

großen, großen Dank

Eine kleine Frage habe ich allerdings noch. Ich habe das Ganze nun mit folgendem Befehl ausgeführt:

Code:
C:\Users\me\workspace\MJ>java -javaagent:lib\jass.modern.core-20070519.jar -cp bin;"C:\Program Files\Java\jdk1.
6.0_18\lib\tools.jar" foo.Bar 1 3 4
Exception in thread "main" jass.modern.core.PreConditionError: [args.length % 2 == 0]
        at foo.Bar.main(Bar.java:10)


Du hast "jass.modern.core-20070519.jar" zweimal eingebunden, klappt aber auch mit nur einmal einbinden. Hast du die jar-Datei mit absicht zwei mal eingebunden?
Was genau passiert mit dem Befehl "-cp bin"?

lg,
dani
 
Hallo,

Du hast "jass.modern.core-20070519.jar" zweimal eingebunden, klappt aber auch mit nur einmal einbinden. Hast du die jar-Datei mit absicht zwei mal eingebunden?
Was genau passiert mit dem Befehl "-cp bin"?
Du hast recht, die zweite jar-Angabe war nicht nötig, da ein jar das per javaagent angegeben wird auch im Classpath liegt.
-cp ist die Kurzform für -classpath. Mit -cp bin habe ich explizit das bin Verzeichnis in den Classpath aufgenommen, damit die .class Files für
das Ausführen des Beispiels gefunden werden können.

Gruß Tom
 
Zurück