2011-11-27 40 views
2

我是SCXML的新手,即使是最簡單的應用程序也無法啓動。當我嘗試啓動它時,出現以下異常。但是我在類路徑上有該類的庫commons-scxml-0.9.jar。有任何想法嗎?Apache Commons SCXML - 無法找到JexlContext

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/jexl/JexlContext 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:103) 
at main.StateMachineImpl.<init>(StateMachineImpl.java:8) 
at main.Main.main(Main.java:6) 

Caused by: java.lang.ClassNotFoundException: org.apache.commons.jexl.JexlContext 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
... 15 more 

下面是代碼:

Main class

public class Main { 
    public static void main(String[] args) { 
     StateMachineImpl stateMachineImpl = new StateMachineImpl(); 
     stateMachineImpl.fireEvent(Event.START.getEvent()); 
     stateMachineImpl.fireEvent(Event.STOP.getEvent()); 
    } 
} 

Event

public enum Event { 

    START("event.start"), STOP("event.stop"); 

    private String event; 

    private Event(String event) { 
     this.event = event; 
    } 

    public String getEvent() { 
     return event; 
    } 

    public void setEvent(String event) { 
     this.event = event; 
    } 

} 

StateMachineImpl

public class StateMachineImpl extends AbstractStateMachine { 

    public StateMachineImpl() { 
     super(StateMachineImpl.class.getClassLoader().getResource("state-machine-cfg.xml")); 
    } 

    public void off() { 
     System.out.println("StateMachine is OFF"); 
    } 

    public void running() { 
     System.out.println("StateMachine is RUNNING"); 
    } 

} 

state-machine-cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" 
    initialstate="off"> 

    <state id="off"> 
     <transition event="event.start" target="running" /> 
    </state> 

    <state id="running"> 
     <transition event="event.stop" target="off" /> 
    </state> 

</scxml> 

編輯 - 解決方案: 我必須添加額外的依賴(我以爲他們會通過的Maven被自動加載)。

pom.xml dependencies

<dependency> 
    <groupId>commons-scxml</groupId> 
    <artifactId>commons-scxml</artifactId> 
    <version>0.9</version> 
</dependency> 
<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <version>1.1.1</version> 
</dependency> 
<dependency> 
    <groupId>commons-jexl</groupId> 
    <artifactId>commons-jexl</artifactId> 
    <version>1.1</version> 
</dependency> 
<dependency> 
    <groupId>xalan</groupId> 
    <artifactId>xalan</artifactId> 
    <version>2.7.1</version> 
</dependency> 
+0

我喜歡pom.xml解決方案最好的,很好的工作。 –

回答

2

添加commons-jexl.jar到CLASSPATH爲好。根據0.9,你還需要版本的項目pom.xml(不包括傳遞depndencies):

  • commons-logging
  • commons-digester
  • commons-beanutils
  • commons-el
+0

謝謝。我只需要添加'commons-logging','commons-jexl'和'xalan'庫。 – user219882