Apache Commons SCXML - 找不到JexlContext

3

我刚接触SCXML,甚至无法启动最简单的应用程序。当我尝试启动它时,我会收到以下异常。但是我已经将库commons-scxml-0.9.jar和该类放在了类路径上。有任何想法吗?

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

这里是代码:
主类
public class Main {
    public static void main(String[] args) {
        StateMachineImpl stateMachineImpl = new StateMachineImpl();
        stateMachineImpl.fireEvent(Event.START.getEvent());
        stateMachineImpl.fireEvent(Event.STOP.getEvent());
    }
}

事件

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中的依赖项

<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>

我最喜欢的是pom.xml解决方案,干得好。 - Pete B.
3个回答

3
commons-jexl.jar 添加到 CLASSPATH 中。 根据项目pom.xml 的版本0.9,您还需要以下库(不包括传递依赖项):
  • commons-logging
  • commons-digester
  • commons-beanutils
  • commons-el

谢谢。我只需要添加commons-loggingcommons-jexlxalan库。 - user219882

1

0

我在问题发布后大约12年遇到了相同的问题。答案对于当前版本的common-scxml2无效。我找到了一个解决方案,即添加当前所需版本的jexl3。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-jexl3</artifactId>
    <version>3.3</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接